Ответ вслух Senior Условные и mapped-типы обновлено

Условные типы и infer

Вопрос

Расскажите, как работают условные типы: распределение по объединению, infer, и где это нужно в прикладном коде.

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Условный тип выбирает ветку по проверке присваиваемости: T extends string ? 'text' : 'other'.

Что должно прозвучать в ответе

  • `T extends U ? X : Y` вычисляется на уровне типов, для обобщённого T откладывается до подстановки

  • Распределение: голый параметр с union применяется к каждому члену; отключается обёрткой `[T]`

  • `never` как пустое объединение даёт `never` в распределительном типе

  • `infer` объявляет переменную типа в шаблоне: `ReturnType`, `Awaited`, разбор строк

  • Прикладные примеры: тип ответа API по пути, извлечение параметров маршрута, `Extract`/`Exclude`

Что могут спросить следом

  • Как написать IsNever<T>?
  • Чем infer X extends C отличается от вложенной проверки?
  • Когда условные типы вредны?

Разбор

Условный тип выбирает ветку по проверке присваиваемости: T extends string ? 'text' : 'other'. Если T ещё обобщённый, вычисление откладывается до конкретного типа. Если слева голый параметр, а подставили объединение, тип распределяется: Exclude<'a' | 'b', 'a'> проверяет каждый член отдельно. Отсюда две ловушки: распределение не всегда нужно (тогда [T] extends [U]), а never как пустое объединение даёт never, поэтому IsNever пишут через кортеж. infer позволяет вытащить часть типа по шаблону: тип возврата функции, элемент массива, значение промиса, кусок строки в шаблонном литерале; с TS 4.7 можно сразу ограничить infer X extends number. В прикладном коде это типы-помощники: параметры роута из строки, тип ответа по эндпоинту, выбор вариантов union по дискриминанту. Вредны они, когда становятся нечитаемыми или тормозят проверку: тогда лучше явный тип или кодогенерация.

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

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