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→ 成立,返回never2 extends 1|2→ 成立,返回never3 extends 1|2→ 不成立,返回3
最后将所有分支结果合并,never | never | 3会被简化为3。
三、差异的本质
两种场景的核心区别在于是否触发分布式条件类型:
- 当
extends左侧是直接的联合类型时,按整体类型做兼容性判断 - 当
extends左侧是裸泛型参数,且传入的是联合类型时,会遍历联合类型的每个成员单独判断,再合并结果
内容的提问来源于stack exchange,提问作者Janice Zhong
相关产品推荐
相关产品推荐

