Kelas Ralat Lanjutan - TypeScript
P粉311563823
P粉311563823 2023-10-17 00:02:47
0
2
504

Saya cuba membuang ralat tersuai dan mencetak nama kelas "CustomError" saya dalam konsol dan bukannya "Ralat", tetapi tidak berjaya:

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

Keluarannya ialah Uncaught Error: Load "foo" very pain.

Apa yang saya jangkakan: Uncaught CustomError:Lorem“foo”ipsum dolor.

Saya tertanya-tanya sama ada ia boleh dilakukan hanya menggunakan TS (tanpa mengacaukan prototaip JS)?

P粉311563823
P粉311563823

membalas semua(2)
P粉659516906

Masalahnya ialah apabila anda memanggil contoh super 并且该新对象没有预期的原型链,即它是 Error 的实例,而不是 CustomError .

Masalah ini boleh diselesaikan secara elegan menggunakan 'new.target', yang disokong sejak Typescript 2.2, lihat di sini: 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; } 
  }
}

Kelas yang diwarisi menggunakan new.target 的优点是您不必对原型进行硬编码,就像这里提出的其他一些答案一样。这又具有一个优点,即从 CustomError juga akan mendapat rantai prototaip yang betul secara automatik.

Jika anda ingin mengekodkan prototaip anda (cth. Object.setPrototype(this, CustomError.prototype)),CustomError 本身将有一个工作原型链,但任何类从 CustomError 继承将会被破坏,例如class VeryCustomError 的实例不会是预期的 instanceof VeryCustomError,而只是 instanceof CustomError.

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

P粉949848849

Adakah anda menggunakan skrip taip versi 2.1 dan menukar kepada ES5? Semak bahagian halaman perubahan pecah ini untuk kemungkinan isu dan penyelesaian: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-in-like-error -array -dan-peta-mungkin-tidak-berfungsi lagi

Bit berkaitan:

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan