Выбор ответа 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.
Варианты ответа
- Синтаксическую ошибку: после
inferограничения черезextendsписать нельзя Nсразу ограниченnumber: не число в начале, и ветка просто не совпадётправильный ответ- Преобразование первого элемента кортежа в число в рантайме, как
Number(x) - То же, что
infer Nбез ограничения: компилятор игнорируетextends number
Разбор
infer X extends C (TS 4.7) проверяет выведенный тип на ограничение и даёт его внутри истинной ветки как подтип C. Раньше писали вложенный условный тип N extends number ? ... : never. Особенно полезно с шаблонными литералами: `${infer N extends number}` превращает строку '42' в число-литерал 42. Рантайма у типов нет, ограничение не игнорируется.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Как отключить распределение условного типа
Следующий вопрос
Omit на дискриминированном объединении