索引访问类型与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→ 结果为truefalse 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
相关产品推荐
相关产品推荐

