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

索引访问类型与extends结合的工作原理及Test类型结果疑问

索引访问类型与extends结合的工作机制,以及你的代码返回false的原因

问题拆解

你的代码尝试通过T[number] extends true判断数组类型的元素是否符合条件,但传入[true, true, false]后返回false(实际更准确的类型是boolean,你看到的false是联合类型的成员之一),核心原因是TypeScript的分配条件类型规则。

1. 索引访问类型的行为

对于数组类型T,T[number]是索引访问类型,它会提取数组所有元素的类型,组合成一个联合类型。比如:

type Elements = [true, true, false][number] // true | false

2. 条件类型的分配规则

当条件类型的左侧是一个联合类型时,TypeScript会自动触发分配行为:它会将联合类型的每个成员单独代入条件进行判断,然后将所有判断结果重新组合成一个新的联合类型。

对应你的代码:

type Test<T extends readonly any[]> = T[number] extends true ? true : false
type R = Test<[true, true, false]>

执行过程如下:

  • 第一步:T[number]解析为true | false
  • 第二步:对联合类型的每个成员分别应用条件判断:
    • true extends true → 结果为true
    • false extends true → 结果为false
  • 第三步:将两个结果合并,得到true | false(即boolean类型)

你看到的false是这个联合类型的成员,但本质上R的类型是boolean。

3. 如何实现“数组所有元素都是true则返回true”

如果你想要判断数组的所有元素都符合true类型,应该直接用数组类型的约束,而非索引访问后的联合类型:

type Test<T extends readonly any[]> = T extends readonly true[] ? true : false
type R1 = Test<[true, true, false]> // false
type R2 = Test<[true, true]> // true

这种写法直接判断整个数组类型是否是readonly true[]的子类型,只有当所有元素都是true时才会返回true。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:10:11