type IsFirstTrue<T extends unknown[]> =
T extends [infer First, ...infer Rest]
? First extends true
? true
: false
: false
// let a: boolean
let a: IsIndexedTypeTrue<[boolean]>
我试图创建一个类型IsFirstTrue
,检查数组类型的第一个元素是否为类型true
。
对于类型[boolean]
作为输入,结果类型应该计算为false
,因为它的第一个类型不是true
类型,而是计算为boolean
,这是奇怪的,因为在代码中甚至没有说明boolean
类型,只有true
或false
。为什么会发生这种情况?
注意boolean
既不是true
也不是false
(它是两者的并集的表示):
TS操场
declare const b: true | false;
//^? const b: boolean
我想你可能在找这样的东西:
TS操场
type IsFirstTrue<T extends readonly unknown[]> =
T extends [true, ...readonly unknown[]]
? true
: false;
declare const a: IsFirstTrue<[boolean]>;
//^? const a: false
declare const b: IsFirstTrue<[true]>;
//^? const b: true
declare const c: IsFirstTrue<[false]>;
//^? const c: false
declare const d: IsFirstTrue<[string]>;
//^? const d: false
declare const e: IsFirstTrue<[number]>;
//^? const e: false
declare const f: IsFirstTrue<[true, number]>;
//^? const f: true
// ...etc.