TypeScript函数重载内部参数类型推断异常,求可行解决方案
问题解决:TypeScript函数重载内部类型推断失效
你遇到的问题是函数重载在外部调用时类型校验正常,但内部无法通过name的值自动推断age的对应类型——这是因为TS的函数重载仅作用于外部调用的类型检查,内部实现里的name和age是两个独立的联合类型,TS没办法自动关联它们的对应关系。
下面是几种可行的解决方式:
方案一:手动类型断言(简单直接)
在if块内手动将age断言为对应类型,适合快速解决小场景:
function foo(name: "a", age: string): void; function foo(name: "b", age: number): void; function foo(name: "a" | "b", age: string | number) { if (name === "a") { const x = age as string; // 现在x的类型为string } }
方案二:使用可辨识联合类型(推荐,类型安全)
把参数封装成对象,利用可辨识联合让TS自动关联name和age的类型关系,这种方式最安全且易维护:
// 定义联合类型,绑定name和age的对应关系 type FooParams = | { name: "a"; age: string } | { name: "b"; age: number }; function foo(params: FooParams) { if (params.name === "a") { const x = params.age; // TS自动推断x为string } else { const y = params.age; // TS自动推断y为number } } // 调用校验依然正常 foo({ name: "a", age: "asd" }); // 正确 foo({ name: "a", age: 5 }); // 错误 foo({ name: "b", age: 5 }); // 正确 foo({ name: "b", age: "asd" }); // 错误
方案三:泛型绑定参数类型(保留原调用方式)
通过泛型约束来关联name和age的类型,既保留原有的参数传递方式,又能让TS内部正确推断:
function foo<T extends "a" | "b">( name: T, age: T extends "a" ? string : number ) { if (name === "a") { const x = age; // x类型自动为string } else { const y = age; // y类型自动为number } } // 调用校验正常 foo("a", "asd"); // 正确 foo("a", 5); // 错误 foo("b", 5); // 正确 foo("b", "asd"); // 错误
内容的提问来源于stack exchange,提问作者Professor Chaos
相关产品推荐
相关产品推荐

