иконка discount

Скидка 10% по промокоду

весенняя распродажа до 01.05иконка discount
SPRING2024
логотип PurpleSchool
Иконка входаВход
  • Обучение
  • Войти
логотип PurpleSchool

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

30 сентября 2022 г.
1 006 просмотров
фото команды
Автор

Антон

Если вы давно пишете на 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.

изображение курса

TypeScript с нуля

Антон Ларичев
иконка часов18 часов лекций
иконка звёздочки рейтинга4.8
TypeScript с нуля