Какой тип у ошибки в блоке 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 напрямую нельзя.