TypeScript工具类型Extract与条件类型的类型推断差异解惑
TypeScript中Extract<T, U>与普通条件类型的差异解析
先看你给出的代码示例:
export type NumberOrString = number | string; export type ConditionalType = NumberOrString extends string ? string : never; // ^? type ConditionalType = never export type ExtractedType = Extract<NumberOrString, string>; // ^? type ExtractedType = string
核心差异在于分布式条件类型的触发逻辑:
普通条件类型的判断逻辑
ConditionalType里是直接用NumberOrString(即number | string联合类型)整体判断是否extendsstring。因为number | string包含了number类型,并非完全属于string的子类型,所以条件不成立,最终结果是never。Extract工具类型的分布式特性
Extract的定义是type Extract<T, U> = T extends U ? T : never,这里的T是一个裸类型参数(没有被数组、对象等包裹的类型参数)。当传入的T是联合类型时,TypeScript会自动触发分布式条件类型:- 把联合类型拆分为单个成员:
number和string - 对每个成员分别执行条件判断:
number extends string ? number : never→ 结果为neverstring extends string ? string : never→ 结果为string
- 最后将所有成员的判断结果重新组合成联合类型:
never | string,而never会被联合类型吸收,最终得到string。
- 把联合类型拆分为单个成员:
简单来说,Extract利用了TypeScript对裸类型参数的分布式处理,实现了从联合类型中提取符合条件的子类型;而直接写的普通条件类型是对整个联合类型做整体判断,自然得不到相同结果。
内容的提问来源于stack exchange,提问作者Kernel Dang
相关产品推荐
相关产品推荐

