Обработка ошибок в typescript 4.4

TypeScript 4.4 — Обработка ошибок

Если вы давно пишете на TypeScript, скорее всего взвели у себя в tsconfig.json флаг "strict": true, который включает сразу несколько проверок:

  • alwaysStrict
  • strictNullChecks,
  • strictBindCallApply
  • strictFunctionTypes
  • strictPropertyInitialization
  • noImplicitAny
  • noImplicitThis

В TS 4.4 к ним добавилось новое правило: useUnknownInCatchVariables. Что означает, что код ниже уже будет давать ошибку.

const run = (i: number) => {
throw new Error('Ошибка');
}
const main = () => {
try {
run(1);
} catch (e) {
console.log(e.message);
// вот эта строка будет подсвечена
}
};
main();

Почему так? Теперь в catch мы получаем ошибку не типа any, а типа unknown. Поэтому нам нужно сделать проверка на тип, перед тем, как выполнять то или иное действие. Ведь вы действительно можете сделать свой класс ошибки, отнаследовавшись от стандартного класса Error. Тем самым нас подталкивают к корректной работе с ошибками:

const run = (i: number) => {
throw new Error('Ошибка');
}
const main = () => {
try {
run(1);
} catch (e) {
if (e instanceof Error) {
console.log(e.message);
}
}
};
main();

Ведь если бы мы имели несколько ошибок, которые возникнут в функции, мы бы получили внятный type-safety. Допустим мы сделали свою ошибку:

**class HttpError extends Error {
code: number;
constructor(message: string, code: number) {
super(message);
this.code = code;
}
}**

Тогда наш код был бы полностью безопасным при следующей записи:

const run = (i: number) => {
if (i == 0) {
throw new HttpError('Ошибка', 500);
}
throw new Error('Ошибка');
}
const main = () => {
try {
run(1);
} catch (e) {
if (e instanceof Error) {
console.log(e.message);
}
if (e instanceof HttpError) {
console.log(e.code);
}
}
};
main();

Поэтому всегда используйте проверку на тип ошибки и включите наконец strict если не делали этого раньше.

P.S. Не путайте с 'use strict' в JS. За это отвечает опция alwaysStrict.

Об авторе

Антон Ларичев Технический директор и профессиональный разработчик

Работаю техническим директором в компании по продаже и оценке автомобилей с пробегом. Занимают разработкой уже более 12 лет и имею большой опыт: JavaScript, TypeScript, Php, Go, C#, Swift и Python. Активно внедряю гибкие методологии разработки в компании и внутренние обучения для команд.

Мой сайт: https://purpleschool.ru/

На сайте вы можете найти полезные материалы и мои авторские курсы по NodeJS, NextJS, React, Docker, Ansible и другим технологиям.

--

--

--

IT Director in car selling company. In love with TypeScript, NodeJS and Angular.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Anton Larichev

Anton Larichev

IT Director in car selling company. In love with TypeScript, NodeJS and Angular.

More from Medium

Bundling a TypeScript library for Node with Rollup.JS

A Note About Refactoring and Migrating a Project to Webpack 5

Crafting JS Apps with JSDoc and TypeScript

TDD — Unit Testing TypeScript project with Jest