如何根据泛型参数获取泛型函数的正确返回类型?
解决泛型函数特定参数下的返回类型推断问题
你遇到的问题核心在于:typeof f1得到的是一个未指定类型参数的泛型函数类型,而非针对number参数实例化后的具体函数类型。当你直接用条件类型匹配时,TypeScript无法自动将泛型参数T绑定为number,反而会因为泛型的通用性,将T推断为unknown,最终导致返回类型不符合预期。
下面给你两种可靠的解决方法:
方法1:使用ReturnType工具类型 + 显式指定泛型参数
这是最直接的方式,先将泛型函数实例化为针对number参数的版本,再用ReturnType提取返回类型:
function f1<T>(o: T) { return { a: o } } type T1 = ReturnType<typeof f1<number>>; // 类型为 { a: number }
方法2:用条件类型显式约束泛型参数
如果你一定要用条件类型的写法,可以先让泛型函数的类型参数绑定为number,再推断返回类型:
function f1<T>(o: T) { return { a: o } } type T1 = (typeof f1)<number> extends (o: number) => infer R ? R : never; // 类型为 { a: number }
为什么原来的写法不行?
原来的代码typeof f1 extends (n: number) => infer R ? R : never中,typeof f1是泛型函数类型<T>(o: T) => { a: T }。当TypeScript检查它是否匹配(n: number) => infer R时,会将泛型参数T视为兼容number的任意类型(因为泛型函数需要支持所有可能的T),所以最终T被推断为unknown,导致返回类型不符合预期。显式指定泛型参数是解决这个问题的关键。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

