検索

ホームページ  >  に質問  >  本文

拡張エラークラス - TypeScript

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

リーリー

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

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

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

P粉311563823P粉311563823409日前505

全員に返信(2)返信します

  • P粉659516906

    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 のインスタンスは、予期される < CustomErrorinstanceof VeryCustomError ではなく、単なる instanceof CustomError になります。

    参照:

    https://github.com/Microsoft/TypeScript/issues /13965#issuecomment-278570200

    返事
    0
  • P粉949848849

    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 -配列とマップは機能しなくなる可能性があります

    関連項目:

    返事
    0
  • キャンセル返事