Выбор ответа Senior Объединения и сужение обновлено

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);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: У константы assertUser нет явной аннотации, а assertion-вызову она нужна. Анализ потока управления должен знать, что вызов это утверждение, ещё до вывода типов.

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

  1. Утверждения asserts разрешены только в методах классов, а не в функциях
  2. У константы assertUser нет явной аннотации, а assertion-вызову она нужнаправильный ответ
  3. Стрелочные функции не могут бросать исключения, а asserts их требует
  4. Нужно включить useUnknownInCatchVariables, чтобы unknown сужался

Разбор

Анализ потока управления должен знать, что вызов это утверждение, ещё до вывода типов. Поэтому для стрелочной функции в константе нужна явная аннотация: const assertUser: (v: unknown) => asserts v is User = ..., или объявление через function. Ограничения «только в классах» нет, стрелочные функции бросают исключения как обычно, а флаг про catch не связан.

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

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