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
(это представление союза обоих):
declare const b: true | false;
//^? const b: boolean
Я думаю, вы, вероятно, ищете что-то вроде этого:
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.
хорошо, ничего страшного, я спрашивал в основном из любопытства, но если jcalz может добавить больше информации, будет еще лучше.
Итак, поскольку
boolean
является объединением, в нем применяется логика, как в распределенных условных типах? (Я думал, что распределенные условные типы применяются к универсальным голым типам, которые являются объединениями, соответствует лиFirst
таковым?)