Home > OS >  Why does my custom type evaluate to boolean?
Why does my custom type evaluate to boolean?

Time:11-28

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

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

I'm trying to create a type IsFirstTrue that checks whether the first element of an array type is of type true.

For the type [boolean] as input the resulting type should evaluate to false since its first type is not of type true, but it evaluates to boolean instead, which is odd since in the code the boolean type is not even stated, only true or false. Why does this happen?

CodePudding user response:

Note that boolean is neither true nor false (it is a representation of a union of both):

TS Playground

declare const b: true | false;
            //^? const b: boolean

I think you're probably looking for something like this:

TS Playground

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.

  • Related