このコードについて
try {
throw new CustomError();
}
catch (err) {
console.log(err.aPropThatDoesNotExistInCustomError);
}
err
はany
であり、型エラーをトリガーしません。エラーが予想されるタイプにどのように絞り込むことができますか?
キャッチブロックの内部を狭めるには、自分でチェックする必要があります。コンパイラーは、err
が確実にCustomError
になることを認識も信じもしません。
try {
throw new CustomError();
}
catch (err) {
console.log('bing');
if (err instanceof CustomError) {
console.log(err.aPropThatIndeedExistsInCustomError); //works
console.log(err.aPropThatDoesNotExistInCustomError); //error as expected
} else {
console.log(err); // this could still happen
}
}
たとえば、これはCustomError
の私の邪悪な実装です。
class CustomError extends Error {
constructor() {
super()
throw new Error('Not so fast!'); // The evil part is here
}
aPropThatIndeedExistsInCustomError: string;
}
この場合、err
はCustomError
ではありません。それはおそらく起こらないでしょうが、要点は、コンパイラーがこの絞り込みを自動的に行わないことです。タイプが確実にわかっている場合は、別の変数に割り当てることができます。
try {
throw new CustomError();
}
catch (_err) {
const err: CustomError = _err;
console.log(err.aPropThatDoesNotExistInCustomError); // errors as desired
}
ただし、タイプを間違えると、実行時に問題が発生する可能性があることに注意してください。
幸運を!