TypeScript中如何获取指定参数类型的重载函数返回值类型?
TypeScript 重载函数指定版本返回值类型获取方案
你需要的仅通过指定参数类型获取对应重载返回值的方案是存在的,我们可以通过自定义TS工具类型实现,完全在类型层面完成匹配,不需要编写任何运行时代码。
TS原生的ReturnType只会取重载函数的最后一个签名做推断,这也是无法直接用ReturnType匹配指定重载的核心原因,我们自定义的工具类型通过显式传入参数类型,就能精准匹配到目标重载签名。
自定义工具类型实现
type OverloadReturnType<T extends (...args: any[]) => any, Params extends any[]> = T extends (...args: Params) => infer R ? R : never;
用法示例
以你给出的重载函数为例:
function fn(arg: string): string; function fn(arg: number): number; function fn(arg: string | number): string | number { return arg; } // 匹配入参为string的重载,返回值类型为string type Type1 = OverloadReturnType<typeof fn, [string]>; // 匹配入参为number的重载,返回值类型为number type Type2 = OverloadReturnType<typeof fn, [number]>;
注意事项
- 匹配规则和TS重载匹配逻辑一致,会按重载声明的先后顺序匹配符合参数类型的签名
- 支持匹配带可选参数、剩余参数的重载,只需要将第二个参数的元组类型和目标重载的入参类型对齐即可
- 如果传入的参数类型没有匹配到任何重载,会返回
never类型,方便排查错误
内容的提问来源于stack exchange,提问作者Leo Jiang
相关产品推荐
相关产品推荐

