J'ai essayé de générer une erreur personnalisée et d'imprimer le nom de ma classe "CustomError" dans la console au lieu de "Erreur", mais sans succès :
class CustomError extends Error { constructor(message: string) { super(`Lorem "${message}" ipsum dolor.`); this.name = 'CustomError'; } } throw new CustomError('foo');
La sortie est Uncaught Error: Load "foo" very pain
.
Ce à quoi je m'attendais : Uncaught CustomError:Lorem“foo”ipsum dolor
.
Je me demandais si cela pouvait être fait en utilisant uniquement TS (sans jouer avec les prototypes JS) ?
Le problème est lorsque vous appelez une instance de
super
并且该新对象没有预期的原型链,即它是Error
的实例,而不是CustomError
.Ce problème peut être résolu avec élégance en utilisant 'new.target', qui est pris en charge depuis Typescript 2.2, voir ici : https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2- 2.html
Les classes héritées en utilisant
new.target
的优点是您不必对原型进行硬编码,就像这里提出的其他一些答案一样。这又具有一个优点,即从CustomError
obtiendront également automatiquement la bonne chaîne de prototypes.Si vous souhaitez coder en dur votre prototype (par exemple
Object.setPrototype(this, CustomError.prototype)
),CustomError
本身将有一个工作原型链,但任何类从CustomError
继承将会被破坏,例如class VeryCustomError 的实例不会是预期的
instanceof VeryCustomError
,而只是instanceof CustomError
.Voir aussi : https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200
Utilisez-vous la version 2.1 de TypeScript et effectuez une conversion vers ES5 ? Consultez cette section de la page des modifications avec rupture pour connaître les problèmes possibles et les solutions de contournement : https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error -array -et-la-carte-peut-ne-fonctionner-plus
Bits associés :