搜尋

首頁  >  問答  >  主體

擴展錯誤類別 - TypeScript

我試圖拋出自訂錯誤,並在控制台中列印我的“CustomError”類別名稱而不是“Error”,但沒有成功:

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

輸出是 Uncaught Error: Load "foo" very pain.

我所期望的:Uncaught CustomError:Lorem“foo”ipsum dolor

我想知道是否可以只使用 TS 來完成(而不弄亂 JS 原型)?

P粉311563823P粉311563823448 天前533

全部回覆(2)我來回復

  • P粉659516906

    P粉6595169062023-10-17 19:52:38

    問題在於,當您呼叫super 並且該新物件沒有預期的原型鏈,即它是Error 的實例,而不是CustomError 的實例。

    這個問題可以用'new.target'來優雅地解決,從Typescript 2.2 開始就支援它,請參考這裡:https://www.typescriptlang.org/docs/handbook/release-notes/ typescript-2-2.html

    #
    class CustomError extends Error {
      constructor(message?: string) {
        // 'Error' breaks prototype chain here
        super(message); 
    
        // restore prototype chain   
        const actualProto = new.target.prototype;
    
        if (Object.setPrototypeOf) { Object.setPrototypeOf(this, actualProto); } 
        else { this.__proto__ = actualProto; } 
      }
    }

    使用 new.target 的優點是您不必對原型進行硬編碼,就像這裡提出的其他一些答案一樣。這又具有一個優點,即從 CustomError 繼承的類別也將自動獲得正確的原型鏈。

    如果您要對原型進行硬編碼(例如Object.setPrototype(this, CustomError.prototype)),CustomError 本身將有一個工作原型鏈,但任何類別從CustomError 繼承將會被破壞,例如class VeryCustomError < CustomError< CustomError 的實例不會是預期的instanceof VeryCustomError 另請參閱:

    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-array-and-map-may-no-longer-work

    #相關位元:

    回覆
    0
  • 取消回覆