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

infer в шаблонной строке

Вопрос

Какой тип у X?

type Id<S> = S extends `user-${infer N}` ? N : never;
type X = Id<'user-42'>;

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

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

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

Коротко

Правильный ответ: '42'. Шаблонный литерал с infer сопоставляет строку с образцом: всё после user- попадает в N.

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

  1. 'user-42'
  2. string
  3. number
  4. '42'правильный ответ

Разбор

Шаблонный литерал с infer сопоставляет строку с образцом: всё после user- попадает в N. Получается строковый литерал '42', а не число: из строки в число тип сам не превращается.

Начиная с TypeScript 4.8 число можно получить, указав ограничение infer N extends number. Целая строка 'user-42' вернулась бы в ветке без совпадения при : S, а здесь там never.

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

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