web-dev-qa-db-ja.com

キャッチでエラーの種類を絞り込む

このコードについて

try {
  throw new CustomError();
}
catch (err) {
  console.log(err.aPropThatDoesNotExistInCustomError);
}

erranyであり、型エラーをトリガーしません。エラーが予想されるタイプにどのように絞り込むことができますか?

9
Estus Flask

キャッチブロックの内部を狭めるには、自分でチェックする必要があります。コンパイラーは、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;
}

この場合、errCustomErrorではありません。それはおそらく起こらないでしょうが、要点は、コンパイラーがこの絞り込みを自動的に行わないことです。タイプが確実にわかっている場合は、別の変数に割り当てることができます。

try {
  throw new CustomError();
}
catch (_err) {
  const err: CustomError = _err;
  console.log(err.aPropThatDoesNotExistInCustomError); // errors as desired
}

ただし、タイプを間違えると、実行時に問題が発生する可能性があることに注意してください。

幸運を!

PS:詳細については、TypeScriptの問題 #8677 および #9999 を参照してください。

10
jcalz