给请求函数写了三个重载,编译报 TS2394 This overload signature is not compatible with its implementation signature。删掉其中任意一个,错误就换到另一个上面。日志里能对上时间点,这种反而好排。
实现签名必须能兼容所有重载的入参和返回值,编译器拿每个重载单独跟实现比对。实现里参数写窄了,或者返回联合少了一种,就会逐个报不兼容。这一点先确认清楚,后面就不用反复试。
function get(id: number): User;
function get(id: number, raw: true): string;
function get(id: number, raw?: boolean): User | string {
return raw ? 'json' : ({ id } as User);
}
这次卡住的地方就在「TS2394 函数重载」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。
处理上按这个顺序:把实现签名的参数放宽到能接住所有重载;返回值写成所有重载返回类型的联合;实现体里按参数分支返回 保证每条路径都有值;最后核对调用处的推断结果和重载顺序。
结果对不对很好判断,TS2394 全部消失 三种调用形态各自推断出返回类型 实现体也能跑到。
