Условные типы и infer
Вопрос
Расскажите, как работают условные типы: распределение по объединению, infer, и где это нужно в прикладном коде.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
`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 ошибок.
Предыдущий вопрос
Парсинг query string в типизированный объект
Следующий вопрос
Как отключить распределение условного типа