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

为何自定义类型IsFirstTrue会解析为boolean类型?

问题分析与解决

先看你的代码:

type IsFirstTrue<T extends unknown[]> =
  T extends [infer First,  ...infer Rest] 
  ? First extends true
    ? true
    : false
  : false

// let a: boolean
let a: IsFirstTrue<[boolean]>

你遇到的问题核心是TypeScript条件类型的分配性行为:当条件类型的左侧是一个联合类型时,TypeScript会自动对联合类型的每个成员单独进行条件判断,最后把结果合并成新的联合类型。

这里First被推断为boolean(也就是true | false的联合类型),当执行First extends true时,会拆成两个独立判断:

  • true extends true → 返回true
  • false extends true → 返回false

最终结果就是true | false,也就是boolean类型,这就是为什么变量a的类型是boolean而不是预期的false。

要解决这个问题,只需要禁用条件类型的分配性,方法是把条件两边都用方括号包裹,变成检查数组类型的匹配,而不是联合类型成员的匹配:

type IsFirstTrue<T extends unknown[]> =
  T extends [infer First,  ...infer Rest] 
  ? [First] extends [true] // 这里改成数组包裹的形式
    ? true
    : false
  : false

// 现在 let a: false
let a: IsFirstTrue<[boolean]>

这样[First]是一个包含联合类型的数组,而不是联合类型本身,TypeScript不会触发分配性判断,只会检查整个数组类型是否匹配[true]。因为[boolean]和[true]不匹配,所以直接返回false,符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:41:57