Rumah > Soal Jawab > teks badan
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粉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
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: