Maison > Questions et réponses > le corps du texte
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) ?
P粉6595169062023-10-17 19:52:38
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
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; } } }
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 < CustomError
的实例不会是预期的 instanceof VeryCustomError
,而只是 instanceof CustomError
.
Voir aussi : https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200
P粉9498488492023-10-17 16:00:03
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 :