You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:36:03