TypeScript中extends关键字在泛型/非泛型场景下结果不同的原因
TypeScript 泛型联合类型的分布式条件类型特性
这是TypeScript的特性而非Bug,官方称之为分布式条件类型,是设计时就确定的预期行为。
核心差异原因
泛型场景(C、C2):触发分布式拆分
当条件类型的extends左侧是泛型类型参数,且传入该参数的是联合类型时,TypeScript会自动将联合类型拆分为单个成员,分别执行条件判断,最终将所有结果合并为新的联合类型。
以Check<'a' | 'b', 'a'>为例,实际执行逻辑是:'a' extends 'a' ? 1 : 0→ 返回1'b' extends 'a' ? 1 : 0→ 返回0
最终结果为1 | 0,Check2<'a' | 'b'>遵循完全相同的逻辑。
非泛型场景(C3):无分布式行为
当extends左侧是具体的联合类型(而非泛型参数)时,TypeScript会直接判断整个联合类型是否是右侧类型的子类型。由于'a' | 'b'并不完全属于'a'的子类型,因此结果为0。
禁用分布式行为的方法
如果需要在泛型场景中避免分布式拆分,可以将extends左侧的泛型参数包裹在元组中,阻止TypeScript拆分联合类型:
type CheckNoDistribute<T, U> = [T] extends [U] ? 1 : 0; type C4 = CheckNoDistribute<'a' | 'b', 'a'> // 结果为 0
内容的提问来源于stack exchange,提问作者Eugene Karataev
相关产品推荐
相关产品推荐

