カスタム エラーをスローし、「Error」の代わりに「CustomError」クラス名をコンソールに出力しようとしましたが、成功しませんでした。
リーリー出力は次のようになります。 Uncaught Error: Load "foo" very pain
.
私が期待していたこと: Uncaught CustomError: Lorem "foo" ipsum dolor
。
(JS プロトタイプをいじらずに) TS だけを使用して実行できるかどうか疑問に思っていました。
P粉6595169062023-10-17 19:52:38
問題は、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 < CustomError のインスタンスは、予期される < CustomError
instanceof VeryCustomError ではなく、単なる
instanceof CustomError になります。
https://github.com/Microsoft/TypeScript/issues /13965#issuecomment-278570200
P粉9498488492023-10-17 16:00:03
typescript バージョン 2.1 を使用していて、ES5 に変換していますか?考えられる問題と回避策については、重大な変更ページのこのセクションを確認してください: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built -ins-like -error -配列とマップは機能しなくなる可能性があります
関連項目: