Выбор ответа Senior Дженерики обновлено
NoInfer<T> (TS 5.4)
Вопрос
Зачем здесь NoInfer?
function createFSM<S extends string>(states: S[], initial: NoInfer<S>) {}
createFSM(['idle', 'loading'], 'idel');
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Без него S вывелся бы и из initial, и опечатка 'idel' прошла бы молча. NoInfer<T (встроенный с TS 5.4) исключает позицию из кандидатов вывода.
Варианты ответа
- Он запрещает передавать строковые литералы в
initial, только переменные - Без него код не скомпилируется ни при каких аргументах из-за конфликта вывода
- Он делает
Sравнымstring, чтобы вinitialможно было передать любую строку - Без него
Sвывелся бы и изinitial, и опечатка'idel'прошла бы молчаправильный ответ
Разбор
NoInfer<T> (встроенный с TS 5.4) исключает позицию из кандидатов вывода. Параметр проверяется по уже выведенному S, поэтому опечатка 'idel' становится ошибкой. Литералы не запрещаются, S не расширяется до string, а без NoInfer код компилируется, в этом и проблема.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
strictFunctionTypes: методы и свойства-функции
Следующий вопрос
Перегрузки и аргумент-объединение