TypeScript内置Parameters工具类型无法提取重载方法参数怎么解决?
问题根因
TypeScript 内置的Parameters工具类型底层基于条件类型实现,而条件类型匹配重载函数时只会匹配最后一个重载签名,这就是你只能拿到[a: string]类型的核心原因,属于TS类型系统的已知设计限制。
解决方案:自定义重载参数提取工具
可以手动实现支持提取多个重载签名参数的工具类型,如下是支持最多5个重载的通用实现(可根据实际场景扩展上限):
type OverloadParameters<T> = T extends { (...args: infer P1): any; (...args: infer P2): any; (...args: infer P3): any; (...args: infer P4): any; (...args: infer P5): any; } ? P1 | P2 | P3 | P4 | P5 : T extends { (...args: infer P1): any; (...args: infer P2): any; (...args: infer P3): any; (...args: infer P4): any; } ? P1 | P2 | P3 | P4 : T extends { (...args: infer P1): any; (...args: infer P2): any; (...args: infer P3): any; } ? P1 | P2 | P3 : T extends { (...args: infer P1): any; (...args: infer P2): any; } ? P1 | P2 : T extends (...args: infer P) => any ? P : never;
使用示例
套入你给出的场景效果如下:
class Foo { foo(a: number) foo(a: string) foo(mix: number | string) { return mix; } } // 替换内置Parameters为自定义的OverloadParameters type FooParameters = OverloadParameters<Foo['foo']>; // 此时FooParameters类型为 [a: number] | [a: string],包含所有重载的参数类型 function wrapper(...args: FooParameters) { } wrapper(1); // 类型校验正常通过 wrapper('test'); // 类型校验正常通过 wrapper(true); // 会触发类型报错,符合预期
注意事项
- 该工具的重载匹配上限可自行扩展,实际业务中重载签名数量一般不会超过5个,上述实现可覆盖绝大多数场景
- 如果要同时提取重载的返回值类型,也可以参照同样逻辑,自定义
OverloadReturnType工具即可
内容的提问来源于stack exchange,提问作者tenbits
相关产品推荐
相关产品推荐

