为什么我的自定义类型评估为布尔值?


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类型,只有truefalse。为什么会发生这种情况?

注意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.

最新更新