TypeScript中能否定义泛型类型以提取泛型的内部类型?
问题解答
你写的这个Unwrap类型定义根本没法用,TypeScript会直接报错——原因是T extends T<infer U>这种写法不符合语法规则:这里第二个T被当成了能接收类型参数的泛型,但T只是个类型参数,本身不是泛型构造器,TS根本认不出这种用法。
正确提取泛型内部类型的方法
要从泛型实例里揪出内部类型,得针对具体的泛型结构写匹配逻辑,或者用更通用的方式处理:
1. 处理常见泛型场景
比如数组、Promise、函数返回值这些常用的,直接针对性写条件:
type Unwrap<T> = // 提取数组元素类型 T extends (infer U)[] ? U : // 提取Promise的resolve类型 T extends Promise<infer U> ? U : // 提取函数的返回值类型 T extends (...args: any[]) => infer U ? U : // 提取带value属性的对象的value类型 T extends { value: infer U } ? U : // 未匹配情况返回never never;
举几个实际用法的例子:
type ArrayItem = Unwrap<number[]>; // number type PromiseResult = Unwrap<Promise<string>>; // string type FuncReturn = Unwrap<() => boolean>; // boolean type ObjValue = Unwrap<{ value: symbol }>; // symbol
2. 更通用的自定义泛型提取(有局限)
TS没有原生支持“匹配所有泛型”的语法,但如果你的自定义泛型有统一的标识(比如一个内部属性),可以这么写:
// 匹配带__type标识的自定义泛型 type UnwrapGeneric<T> = T extends { __type?: infer U } ? U : never; // 自定义泛型示例 type MyGeneric<U> = { __type?: U; data: U }; type ExtractedType = UnwrapGeneric<MyGeneric<number>>; // number
总结
你一开始的写法存在语法错误,达不到提取泛型内部类型的目的。得根据具体要处理的泛型结构,编写对应的条件类型逻辑,或者针对常见泛型做专门处理。
内容的提问来源于stack exchange,提问作者Adam B.
相关产品推荐
相关产品推荐

