拡張エラークラス - TypeScript
P粉311563823
P粉311563823 2023-10-17 00:02:47
0
2
520

カスタム エラーをスローし、「Error」の代わりに「CustomError」クラス名をコンソールに出力しようとしましたが、成功しませんでした。

リーリー

出力は次のようになります。 Uncaught Error: Load "foo" very pain.

私が期待していたこと: Uncaught CustomError: Lorem "foo" ipsum dolor

(JS プロトタイプをいじらずに) TS だけを使用して実行できるかどうか疑問に思っていました。

P粉311563823
P粉311563823

全員に返信(2)
P粉659516906

問題は、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

いいねを押す +0
P粉949848849

typescript バージョン 2.1 を使用していて、ES5 に変換していますか?考えられる問題と回避策については、重大な変更ページのこのセクションを確認してください: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built -ins-like -error -配列とマップは機能しなくなる可能性があります

関連項目:

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート