Антон Ларичев
Если вы давно пишете на 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
.
Комментарии
0