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

TypeScript中extends内部原理及两种场景差异解析

TypeScript中extends的工作机制及场景差异解析

一、extends的核心逻辑

TypeScript里的extends用于判断类型兼容性,核心是检查左侧类型是否可以赋值给右侧类型。但它的行为会根据左侧是否为裸泛型参数(未被数组、对象等包裹的泛型参数),产生两种完全不同的模式。

二、场景差异的具体原因

场景1:非分布式条件类型

// 场景1
type A = 1 | 2 | 3
type B = 1 | 2
type C = A extends B ? never : A // 返回 1 | 2 | 3

这里A是直接定义的联合类型,并非泛型参数。条件判断时,TypeScript会把整个1|2|3当作单一类型,判断它是否能完全赋值给1|2。由于3不在B的范围内,整个联合类型无法兼容B,因此条件分支走false,返回A本身。

场景2:分布式条件类型

// 场景2
type Exclude<T, U> = T extends U ? never : T
type D = Exclude<A, B>; // 返回 3

Exclude的泛型参数T是裸类型参数,当传入联合类型A时,TypeScript会触发分布式条件类型特性:自动将联合类型拆分为单个成员,逐个执行条件判断:

  • 1 extends 1|2 → 成立,返回never
  • 2 extends 1|2 → 成立,返回never
  • 3 extends 1|2 → 不成立,返回3
    最后将所有分支结果合并,never | never | 3会被简化为3。

三、差异的本质

两种场景的核心区别在于是否触发分布式条件类型:

  • 当extends左侧是直接的联合类型时,按整体类型做兼容性判断
  • 当extends左侧是裸泛型参数,且传入的是联合类型时,会遍历联合类型的每个成员单独判断,再合并结果

内容的提问来源于stack exchange,提问作者Janice Zhong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:43:12