Выбор ответа Senior Условные и mapped-типы обновлено

infer с ограничением

Вопрос

Что даёт запись (TS 4.7+)?

type FirstNum<T> = T extends [infer N extends number, ...unknown[]] ? N : never;

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: N сразу ограничен number: не число в начале, и ветка просто не совпадёт. infer X extends C (TS 4.7) проверяет выведенный тип на ограничение и даёт его внутри истинной ветки как подтип C.

Варианты ответа

  1. Синтаксическую ошибку: после infer ограничения через extends писать нельзя
  2. N сразу ограничен number: не число в начале, и ветка просто не совпадётправильный ответ
  3. Преобразование первого элемента кортежа в число в рантайме, как Number(x)
  4. То же, что infer N без ограничения: компилятор игнорирует extends number

Разбор

infer X extends C (TS 4.7) проверяет выведенный тип на ограничение и даёт его внутри истинной ветки как подтип C. Раньше писали вложенный условный тип N extends number ? ... : never. Особенно полезно с шаблонными литералами: `${infer N extends number}` превращает строку '42' в число-литерал 42. Рантайма у типов нет, ограничение не игнорируется.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.