Assertion function в стрелочной функции
Вопрос
Почему вызов даёт ошибку TS2775 «Assertions require every name in the call target to be declared with an explicit type annotation»?
const assertUser = (v: unknown): asserts v is User => { /* ... */ };
assertUser(data);
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Утверждения
assertsразрешены только в методах классов, а не в функциях - У константы
assertUserнет явной аннотации, а assertion-вызову она нужнаправильный ответ - Стрелочные функции не могут бросать исключения, а
assertsих требует - Нужно включить
useUnknownInCatchVariables, чтобыunknownсужался
Разбор
Анализ потока управления должен знать, что вызов это утверждение, ещё до вывода типов. Поэтому для стрелочной функции в константе нужна явная аннотация: const assertUser: (v: unknown) => asserts v is User = ..., или объявление через function. Ограничения «только в классах» нет, стрелочные функции бросают исключения как обычно, а флаг про catch не связан.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Обработка вебхуков: union событий и in-сужение
Следующий вопрос
Сужение внутри замыканий (TS 5.4)