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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:10:14