0Pricing
TypeScript Academy · Урок

Сужение перехваченных ошибок: unknown и Error

Безопасно обрабатывайте перехваченные ошибки, имеющие тип unknown

«Сужение перехваченных ошибок: unknown и Error» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Добро пожаловать

Начиная с TypeScript 4.0 перехваченные ошибки имеют тип unknown. Это требует явно сузить тип перед использованием свойств ошибки.

Изменение в TS 4.0

В TypeScript 4.0 появился параметр useUnknownInCatchVariables. В строгом режиме перехваченные ошибки имеют тип unknown.
// err is now: unknown
try { doSomething(); }
catch (err) {
  // err.message; // Error — cannot access on unknown
}

Сужение типа через instanceof

Используйте instanceof Error, чтобы безопасно обращаться к свойствам ошибки.
catch (err) {
  if (err instanceof Error) {
    console.error(err.message, err.stack);
  } else {
    console.error('Unknown error:', String(err));
  }
}

Проверка типа isError

Создайте повторно используемую проверку типа для сужения типа ошибки.
function isError(e: unknown): e is Error {
  return e instanceof Error;
}
catch (e) {
  if (isError(e)) console.error(e.message);
}

Сужение до пользовательского типа ошибки

Сужайте тип до пользовательских типов ошибок в блоках catch.
catch (err) {
  if (err instanceof NetworkError) { /* retry */ }
  else if (err instanceof AuthError) { /* redirect */ }
  else if (err instanceof Error) { /* generic */ }
  else throw err;
}

useUnknownInCatchVariables

Этот флаг, входящий в strict начиная с TS 4.4, принудительно задаёт тип unknown для перехваченных ошибок.
{ "compilerOptions": { "useUnknownInCatchVariables": true } }

Строковые ошибки

Некоторый код выбрасывает строки вместо объектов Error. Обрабатывайте оба варианта.
catch (err) {
  const message = err instanceof Error ? err.message : String(err);
  console.error(message);
}

Вспомогательная функция для типизированного выбрасывания

Создайте вспомогательную функцию, которая всегда выбрасывает типизированную ошибку Error.
function throwErr(msg: string, code = 500): never {
  const e: AppError = Object.assign(new Error(msg), { statusCode: code });
  throw e;
}

Повторное выбрасывание неизвестных ошибок

Повторно выбрасывайте ошибки, которые не можете обработать.
catch (err) {
  if (err instanceof KnownError) handle(err);
  else throw err; // propagate unknowns
}

Границы ошибок в React

Границы ошибок React должны обрабатывать неизвестные ошибки из методов жизненного цикла.
componentDidCatch(error: unknown, info: ErrorInfo) {
  if (error instanceof Error) logError(error.message);
}

Тестирование перехваченных ошибок

Тестируйте обработку ошибок с помощью типизированных утверждений.
test('catches errors', async () => {
  jest.spyOn(api, 'fetch').mockRejectedValue(new NetworkError());
  const result = await safeRun();
  expect(result.ok).toBe(false);
});

Быстрая проверка

Какой тип имеет перехваченная ошибка `err` в строгом режиме TypeScript 4.4+?

Итоги

Сужение типов перехваченных ошибок (unknown и Error): вы изучили основные понятия этой темы и узнали, как применять их в реальных проектах на TypeScript.

Часто задаваемые вопросы

Урок «Сужение перехваченных ошибок: unknown и Error» бесплатный?

Да — полный текст урока «Сужение перехваченных ошибок: unknown и Error» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сужение перехваченных ошибок: unknown и Error»?

Безопасно обрабатывайте перехваченные ошибки, имеющие тип unknown Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Сужение перехваченных ошибок: unknown и Error»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Типизированные классы ошибок и иерархии
  2. Шаблон Result: Ok и Err
  3. Сужение перехваченных ошибок: unknown и Error
  4. Обработка ошибок в асинхронном коде TypeScript
← Назад к TypeScript Academy