Выбор ответа 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) исключает позицию из кандидатов вывода.

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

  1. Он запрещает передавать строковые литералы в initial, только переменные
  2. Без него код не скомпилируется ни при каких аргументах из-за конфликта вывода
  3. Он делает S равным string, чтобы в initial можно было передать любую строку
  4. Без него S вывелся бы и из initial, и опечатка 'idel' прошла бы молчаправильный ответ

Разбор

NoInfer<T> (встроенный с TS 5.4) исключает позицию из кандидатов вывода. Параметр проверяется по уже выведенному S, поэтому опечатка 'idel' становится ошибкой. Литералы не запрещаются, S не расширяется до string, а без NoInfer код компилируется, в этом и проблема.

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

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

Термины по теме