Почему мой пользовательский тип оценивается как логический?

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. Почему это происходит?

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обратите внимание, что 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.

Итак, поскольку boolean является объединением, в нем применяется логика, как в распределенных условных типах? (Я думал, что распределенные условные типы применяются к универсальным голым типам, которые являются объединениями, соответствует ли First таковым?)

Giorgi Moniava 27.11.2022 20:02
^ Я предполагаю, что да, но я не знаю, как извлечь эту информацию из компилятора, чтобы получить достоверный ответ. Возможно, его можно получить из промежуточного представления AST или с помощью API компилятора? @jcalz может что-то знать об этом.
jsejcksn 28.11.2022 12:32

хорошо, ничего страшного, я спрашивал в основном из любопытства, но если jcalz может добавить больше информации, будет еще лучше.

Giorgi Moniava 28.11.2022 13:13

Другие вопросы по теме