如何提取TypeScript重载方法的全部函数签名,无需硬编码重写
TypeScript 重载函数入参复用解决方案
你遇到的问题本质是TypeScript 内置的 Parameters 工具类型仅能提取重载函数的最后一个签名入参,无法覆盖所有重载场景,需要自定义工具类型来聚合所有重载的入参类型。
首先定义通用的重载参数提取工具类:
// 可根据实际重载数量调整推断层数,以下默认支持最多4个重载,不够可以自行加层 type OverloadParameters<T> = 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 P) => any ? P : never;
替换原有代码里的参数提取逻辑即可:
declare function foo(x: string): number; declare function foo(x: string, y: number): 42; declare function foo(x: number): string; // 替换内置Parameters为自定义工具类 type fooArgs = OverloadParameters<typeof foo>; declare function bar(...args: fooArgs): string[] const a = foo(123); // 正常调用 const b = foo('123'); // 正常调用 const c = foo('123', 456); // 正常调用 const x = bar(123); // 正常调用 const y = bar('123'); // 正常调用 const z = bar('123', 456); // 正常调用
补充说明:
- 如果重载数量超过4层,只要在
OverloadParameters的推断逻辑中新增对应层数的(...args: infer Pn): any;结构,再把Pn加入后面的联合类型即可,常规业务场景下重载不会超过5层,足够覆盖需求。 - 如果需要同时复用重载对应的返回值类型,可以按照相同逻辑实现
OverloadReturnType工具类,逐层提取所有重载的返回值合并为联合类型。 - 如果你可以修改原
foo函数的类型定义,也可以提前把所有重载签名抽为独立的接口类型,再通过映射类型直接生成bar的类型,逻辑和上述方案本质一致。
内容的提问来源于stack exchange,提问作者user578895
相关产品推荐
相关产品推荐

