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)?
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
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
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: