typescript 为什么我的自定义类型的计算结果为布尔值?

yptwkmov  于 2022-12-01  发布在  TypeScript
关注(0)|答案(1)|浏览(96)
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。为什么会发生这种情况?

nuypyhwy

nuypyhwy1#

请注意,boolean既不是true也不是false(它是两者的并集的表示):
TSPlayground

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

我想你可能在寻找这样的东西:
TSPlayground

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.

相关问题