Classe d'erreur étendue - TypeScript
P粉311563823
P粉311563823 2023-10-17 00:02:47
0
2
503

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粉311563823
P粉311563823

répondre à tous(2)
P粉659516906

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

Voir aussi : https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200

P粉949848849

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 :

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal