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

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

核心差异在于分布式条件类型的触发逻辑:

  1. 普通条件类型的判断逻辑
    ConditionalType里是直接用NumberOrString(即number | string联合类型)整体判断是否extends string。因为number | string包含了number类型,并非完全属于string的子类型,所以条件不成立,最终结果是never。

  2. Extract工具类型的分布式特性
    Extract的定义是type Extract<T, U> = T extends U ? T : never,这里的T是一个裸类型参数(没有被数组、对象等包裹的类型参数)。当传入的T是联合类型时,TypeScript会自动触发分布式条件类型:

    • 把联合类型拆分为单个成员:number和string
    • 对每个成员分别执行条件判断:
      • number extends string ? number : never → 结果为never
      • string extends string ? string : never → 结果为string
    • 最后将所有成员的判断结果重新组合成联合类型:never | string,而never会被联合类型吸收,最终得到string。

简单来说,Extract利用了TypeScript对裸类型参数的分布式处理,实现了从联合类型中提取符合条件的子类型;而直接写的普通条件类型是对整个联合类型做整体判断,自然得不到相同结果。

内容的提问来源于stack exchange,提问作者Kernel Dang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:32:37