TypeScript条件类型中布尔元组差异原因及获取目标类型方法
TypeScript条件类型差异解析与修复
为什么B2、X2和B1、X1类型不同?
这是因为分布式条件类型的特性:当条件类型中的泛型参数是「裸类型参数」(未被数组、元组、对象等类型包裹),且传入的是联合类型时,TypeScript会自动将联合类型的每个成员单独代入条件判断,再将结果合并为新的联合类型。
Test1<T>没有条件判断逻辑,直接返回[T, T],联合类型会作为整体处理,因此Test1<boolean>得到[boolean, boolean],Test1<1|2>得到[1|2, 1|2]。Test2<T>是条件类型,且T是裸类型参数。当传入boolean(本质是true|false联合类型)或1|2时,TypeScript会拆分联合类型分别处理:- 对
boolean:将true和false分别代入条件,得到[true, true]和[false, false],合并后即为[true, true] | [false, false] - 对
1|2:将1和2分别代入条件,得到[1,1]和[2,2],合并后即为[1,1] | [2,2]
- 对
如何让Test2得到[boolean, boolean]?
只需阻止分布式条件类型触发,方法是把泛型参数T用元组(或其他类型)包裹,让条件判断的不是裸类型参数:
type Test2<T> = [T] extends [string] ? 'Something' : [T, T]; // 验证结果: type S2 = Test2<string>; // 'Something' type N2 = Test2<number>; // [number, number] type B2 = Test2<boolean>; // [boolean, boolean] type X2 = Test2<1|2>; // [1|2, 1|2]
这样处理后,条件判断的是整个[T]元组类型,而非裸的T,联合类型不会被拆分,会作为整体代入条件,最终得到预期结果。
内容的提问来源于stack exchange,提问作者hansmaad
相关产品推荐
相关产品推荐

