cari

Rumah  >  Soal Jawab  >  teks badan

Kelas Ralat Lanjutan - TypeScript

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粉311563823P粉311563823463 hari yang lalu549

membalas semua(2)saya akan balas

  • P粉659516906

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

    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 < CustomError 的实例不会是预期的 instanceof VeryCustomError,而只是 instanceof CustomError.

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

    balas
    0
  • P粉949848849

    P粉9498488492023-10-17 16:00:03

    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:

    balas
    0
  • Batalbalas