Выбор ответа Senior Утилитарные типы обновлено
Зачем NoInfer
Вопрос
Что произойдёт при вызове?
function createLight<C extends string>(colors: C[], initial?: NoInfer<C>) {}
createLight(['red', 'yellow'], 'blue');
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ошибка: 'blue' нельзя присвоить в 'red' 'yellow'. NoInfer<C (TypeScript 5.4+) исключает эту позицию из вывода C.
Варианты ответа
- Компилируется:
Cвыводится как'red' | 'yellow' | 'blue' - Ошибка:
'blue'нельзя присвоить в'red' | 'yellow'правильный ответ - Ошибка:
NoInferнельзя использовать в необязательном параметре - Компилируется:
Cвыводится какstring
Разбор
NoInfer<C> (TypeScript 5.4+) исключает эту позицию из вывода C. Тип выводится только из массива: 'red' | 'yellow'. Затем 'blue' проверяется против него и даёт ошибку. Это ровно то, что нужно: значение по умолчанию обязано быть одним из перечисленных цветов.
Без NoInfer компилятор вывел бы C из обоих аргументов, получил бы 'red' | 'yellow' | 'blue', и опечатка прошла бы. string не выводится, потому что ограничение C extends string сохраняет литералы. В необязательном параметре NoInfer использовать можно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.