TypeScript重载函数返回类型推断异常原因咨询
TypeScript重载函数返回类型推断受顺序影响的原因
问题场景
以下代码中,TA是包含TB所有属性的子类型:
type TA = { a: number, b: number, } type TB = { b: number, } // 先声明TB的重载,再声明TA的重载 function fn(arg: TB): string function fn(arg: TA): number function fn(arg: any) { return 1 as any; } const myArg: TA = { a: 10, b: 20 } const result = fn(myArg) // 推断类型为string,不符合预期
调换两个重载声明的顺序后,result的推断类型会变为number。
原因解释
TypeScript的重载解析逻辑是从上到下依次匹配重载签名:
- TypeScript采用结构类型系统,
TA类型的变量可以赋值给TB类型(因为TA拥有TB的所有属性,满足TB的类型约束)。 - 当调用
fn(myArg)时,TypeScript会先检查第一个重载签名fn(arg: TB): string,发现myArg可以赋值给TB类型,就直接匹配该重载,不会继续检查后续更精确的TA重载,因此返回类型被推断为string。 - 调换重载顺序后,第一个签名是
fn(arg: TA): number,myArg直接匹配该签名,返回类型就变为number。
解决方法
将更精确、更具体的重载签名放在前面,确保TypeScript优先匹配最贴合的类型:
type TA = { a: number, b: number, } type TB = { b: number, } // 先声明TA的重载(更精确),再声明TB的重载 function fn(arg: TA): number function fn(arg: TB): string function fn(arg: any) { return 1 as any; } const myArg: TA = { a: 10, b: 20 } const result = fn(myArg) // 推断类型为number,符合预期
内容的提问来源于stack exchange,提问作者StBue
相关产品推荐
相关产品推荐

