К списку постов

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.

Подпишись на статьи

Всего 1 раз в месяц я буду высылать вам подборки свежих статей с сайта.

Если хотите получать материалы и статьи каждую неделю подпишитесь на канал в Telegram PurpleCode.