PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые типы

Какой тип у ошибки в блоке catch в TypeScript?

Продвинутые типы

В блоке catch можно бросить что угодно: строку, число, объект. Поэтому ошибка в TypeScript имеет тип `unknown` (при useUnknownInCatchVariables, который входит в strict с TypeScript 4.4) или any (раньше и при отключённой опции).

Почему не Error

throw 'oops';      // строка
throw { code: 1 }; // объект
throw new Error('boom');

Бросить можно любое значение, а ошибки могут прийти из сторонних библиотек, поэтому гарантировать Error нельзя.

Как работать с unknown

Тип нужно сузить перед использованием:

try {
  doWork();
} catch (error) {
  if (error instanceof Error) {
    console.error(error.message);
  } else {
    console.error('Неизвестная ошибка', error);
  }
}

error.message без проверки не скомпилируется — это защищает от обращения к несуществующему свойству.

Явная аннотация

TypeScript разрешает указать только unknown или any:

try {} catch (e: unknown) {}   // можно
try {} catch (e: Error) {}      // ошибка компиляции

Удобная утилита

function getErrorMessage(error: unknown): string {
  return error instanceof Error ? error.message : String(error);
}

Коротко для собеседования

Ошибка в catch — unknown, потому что бросить можно любое значение. Её сужают через instanceof Error или type guard; указать Error напрямую нельзя.

Другие вопросы раздела