カスタム エラーをスローし、「Error」の代わりに「CustomError」クラス名をコンソールに出力しようとしましたが、成功しませんでした。
出力は次のようになります。 Uncaught Error: Load "foo" very pain.
Uncaught Error: Load "foo" very pain
私が期待していたこと: Uncaught CustomError: Lorem "foo" ipsum dolor。
Uncaught CustomError: Lorem "foo" ipsum dolor
(JS プロトタイプをいじらずに) TS だけを使用して実行できるかどうか疑問に思っていました。
問題は、super を呼び出したときに、新しいオブジェクトに予期されたプロトタイプ チェーンがないことです。つまり、それは のインスタンスではなく、Error のインスタンスです。 CustomError 。
super
のインスタンスではなく、
のインスタンスです。 CustomError
この問題は、Typescript 2.2 以降でサポートされている「new.target」を使用するとエレガントに解決できます。ここを参照してください: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2 -2.html
new.target を使用する利点は、ここで質問された他の回答のように、プロトタイプをハードコーディングする必要がないことです。これには、CustomError を継承するクラスも自動的に正しいプロトタイプ チェーンを取得するというさらなる利点があります。
new.target
CustomError
プロトタイプをハードコードした場合 (例: Object.setPrototype(this, CustomError.prototype))、CustomError 自体は動作するプロトタイプ チェーンを持ちますが、# の任意のクラスは含まれません。 ##CustomError の継承は壊れます。たとえば、 class VeryCustomError のインスタンスは、予期される instanceof VeryCustomError ではなく、単なる instanceof CustomError になります。
Object.setPrototype(this, CustomError.prototype)
の継承は壊れます。たとえば、
ではなく、単なる
になります。
https://github.com/Microsoft/TypeScript/issues /13965#issuecomment-278570200
typescript バージョン 2.1 を使用していて、ES5 に変換していますか?考えられる問題と回避策については、重大な変更ページのこのセクションを確認してください: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built -ins-like -error -配列とマップは機能しなくなる可能性があります
関連項目:
問題は、
super
を呼び出したときに、新しいオブジェクトに予期されたプロトタイプ チェーンがないことです。つまり、それはのインスタンスではなく、
Errorのインスタンスです。 CustomError
。この問題は、Typescript 2.2 以降でサポートされている「new.target」を使用するとエレガントに解決できます。ここを参照してください: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2 -2.html
リーリーnew.target
を使用する利点は、ここで質問された他の回答のように、プロトタイプをハードコーディングする必要がないことです。これには、CustomError
を継承するクラスも自動的に正しいプロトタイプ チェーンを取得するというさらなる利点があります。プロトタイプをハードコードした場合 (例:
参照:Object.setPrototype(this, CustomError.prototype)
)、CustomError
自体は動作するプロトタイプ チェーンを持ちますが、# の任意のクラスは含まれません。 ##CustomErrorの継承は壊れます。たとえば、
class VeryCustomError のインスタンスは、予期される instanceof VeryCustomErrorではなく、単なる
instanceof CustomErrorになります。
https://github.com/Microsoft/TypeScript/issues /13965#issuecomment-278570200
typescript バージョン 2.1 を使用していて、ES5 に変換していますか?考えられる問題と回避策については、重大な変更ページのこのセクションを確認してください: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built -ins-like -error -配列とマップは機能しなくなる可能性があります
関連項目: