Maison  >  Questions et réponses  >  le corps du texte

Classe d'erreur étendue - TypeScript

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粉311563823P粉311563823390 Il y a quelques jours491

répondre à tous(2)je répondrai

  • P粉659516906

    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

    répondre
    0
  • P粉949848849

    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 :

    répondre
    0
  • Annulerrépondre