TypeScript不同入参相同返回的方法重载报TS2394如何解决?
错误原因
TS 的函数重载要求所有对外的重载签名,必须和底层的实现签名参数、返回值完全兼容。你现在的写法把第二个重载签名直接当成了实现,第一个重载接收1个FooModel参数,和第二个的两个字符串参数不匹配,自然会报TS2394错误。
正确实现方式
TS的重载规则是:所有对外暴露的调用签名统一写在最上方(仅写声明,不带实现),最后再写一个兼容所有重载场景的实现函数即可,刚好可以满足你内部统一构造FooModel的需求:
// 对外重载1:直接传入已实例化的FooModel static async myMethod(model: FooModel): Promise<BarResult> // 对外重载2:仅传入两个必填字符串参数,内部帮你构造FooModel static async myMethod(inputText: string, outputText: string): Promise<BarResult> // 底层实现:参数覆盖所有重载场景 static async myMethod(param1: FooModel | string, param2?: string): Promise<BarResult> { let targetModel: FooModel; // 类型收窄判断调用场景 if (typeof param1 === 'string' && typeof param2 === 'string') { // 双字符串入参:内部构造FooModel,其余非必填参数给默认值即可 targetModel = new FooModel(param1, param2, /* 剩下4个参数填你的默认值 */); } else { // 直接传入FooModel的场景 targetModel = param1 as FooModel; } // 后续统一用targetModel执行业务逻辑即可 return new BarResult(); }
注意要点
- 所有对外的重载签名不要写函数体,仅做类型声明
- 实现签名的参数要覆盖所有重载的入参组合,返回值要和重载保持一致
- 内部通过类型判断统一处理入参,不需要外部调用者每次手动实例化
FooModel
内容的提问来源于stack exchange,提问作者Mr.B
相关产品推荐
相关产品推荐

