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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:12:48