1. ホーム
  2. javascript

[解決済み] Typescript - Error クラスの拡張

2022-12-08 13:53:26

質問

カスタム エラーをスローして、"Error" の代わりにクラス名をコンソールに出力しようとしていますが、うまくいきません。

class CustomError extends Error { 
    constructor(message: string) {
      super(`Lorem "${message}" ipsum dolor.`);
      this.name = 'CustomError';
    }
}
throw new CustomError('foo'); 

出力は Uncaught Error: Lorem "foo" ipsum dolor .

期待すること Uncaught CustomError: Lorem "foo" ipsum dolor .

これってTSだけで(JSのプロトタイプをいじらずに)できるのかなぁ?

どうすれば解決するのでしょうか?

Typescript バージョン 2.1 を使用していて、ES5 にトランスパイルしていませんか?可能性のある問題や回避策については、Breaking Changes ページのこのセクションを確認してください。 https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work

該当するビットです。

<ブロッククオート

推奨としては、super(...)呼び出しの直後にプロトタイプを手動で調整することができます。

class FooError extends Error {
    constructor(m: string) {
        super(m);

        // Set the prototype explicitly.
        Object.setPrototypeOf(this, FooError.prototype);
    }

    sayHello() {
        return "hello " + this.message;
    }
}

しかし、FooErrorのサブクラスは、同様にプロトタイプを手動で設定しなければなりません。Object.setPrototypeOf をサポートしないランタイムでは、代わりに次のように使用できます。 __proto__ .

残念ながら、これらの回避策は Internet Explorer 10 およびそれ以前では機能しません。プロトタイプからインスタンス自体にメソッドを手動でコピーすることはできますが (たとえば、FooError.prototype を this にコピーする)、プロトタイプ チェーン自体を修正することはできません。