TypeScript类型层面:为泛型函数应用类型参数并获取返回类型可行吗?
问题解答
结论
这种写法的可行性取决于你的TypeScript版本:
- TypeScript 4.7及以上:可以直接使用
- TypeScript 4.6及以下:不可行
原因说明
在TS 4.7之前,TypeScript不支持直接给typeof wrap这类泛型函数类型传入类型参数。typeof wrap获取到的是泛型函数的定义类型<T>(t: T) => { response: T },而ReturnType工具类型只能处理已经确定类型参数的具体函数类型,无法直接解析泛型函数本身。
TS 4.7版本新增了「泛型函数类型实例化」语法,允许在类型中直接写typeof wrap<T>来获取指定类型参数T后的函数类型,此时ReturnType就能正确提取出对应的返回类型{ response: T }。
兼容所有版本的替代写法
如果需要兼容低版本TS,或者不想依赖版本特性,有两种简单实现方式:
方式1:直接显式定义类型
既然返回结构明确,直接写出类型即可:
type Wrapped<T> = { response: T };
方式2:用条件类型推导
通过条件类型捕获泛型函数的返回值:
const wrap = <T>(t: T) => ({ response: t }); type Wrapped<T> = typeof wrap extends <U>(u: U) => infer R ? (U extends T ? R : never) : never;
内容的提问来源于stack exchange,提问作者caeus
相关产品推荐
相关产品推荐

