Выбор ответа 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.

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

  1. Компилируется: C выводится как 'red' | 'yellow' | 'blue'
  2. Ошибка: 'blue' нельзя присвоить в 'red' | 'yellow'правильный ответ
  3. Ошибка: NoInfer нельзя использовать в необязательном параметре
  4. Компилируется: C выводится как string

Разбор

NoInfer<C> (TypeScript 5.4+) исключает эту позицию из вывода C. Тип выводится только из массива: 'red' | 'yellow'. Затем 'blue' проверяется против него и даёт ошибку. Это ровно то, что нужно: значение по умолчанию обязано быть одним из перечисленных цветов.

Без NoInfer компилятор вывел бы C из обоих аргументов, получил бы 'red' | 'yellow' | 'blue', и опечатка прошла бы. string не выводится, потому что ограничение C extends string сохраняет литералы. В необязательном параметре NoInfer использовать можно.

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

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