web-dev-qa-db-fra.com

Classe d'erreur personnalisée dans TypeScript

J'aimerais créer ma propre classe d'erreurs dans TypeScript, en étendant core Error pour offrir une meilleure gestion des erreurs et des rapports personnalisés. Par exemple, je veux créer une classe HttpRequestError avec l'URL, la réponse et le corps passés dans son constructeur, ce qui correspond avec requête Http à http://example.com a échoué avec le code d'état 500 et le message: Une erreur s'est produite et une trace de pile appropriée.

Comment étendre la classe d'erreur principale dans TypeScript ? J'ai déjà trouvé un message dans SO: Comment étendre un objet Host (par exemple, une erreur) dans TypeScript mais cette solution ne fonctionne pas pour moi. J'utilise TypeScript 1.5.3

Des idées?

40
Kuba T

Jusqu'au 1.6, je viens de créer mes propres classes extensibles.

class BaseError {
    constructor () {
        Error.apply(this, arguments);
    }
}

BaseError.prototype = new Error();

class HttpRequestError extends BaseError {
    constructor (public status: number, public message: string) {
        super();    
    }
}

var error = new HttpRequestError(500, 'Server Error');

console.log(
    error,
    // True
    error instanceof HttpRequestError,
    // True
    error instanceof Error
);
16
thoughtrepo

TypeScript 2.1 présentait des modifications importantes en ce qui concerne les extensions intégrées telles que Error.

De la documentation sur les modifications de typeScript)

class FooError extends Error {
    constructor(m: string) {
        super(m);

        // Set the prototype explicitly.
        Object.setPrototypeOf(this, FooError.prototype);
    }

    sayHello() {
        return "hello " + this.message;
    }
}

Ensuite, vous pouvez utiliser:

let error = new FooError("msg");
if(error instanceof FooError){
   console.log(error.sayHello();
}
87
ziv

J'utilise TypeScript 1.8 et voici comment j'utilise les classes d'erreur personnalisées:

nexpectedInput.ts

class UnexpectedInput extends Error {

  public static UNSUPPORTED_TYPE: string = "Please provide a 'String', 'Uint8Array' or 'Array'.";

  constructor(public message?: string) {
    super(message);
    this.name = "UnexpectedInput";
    this.stack = (<any> new Error()).stack;
  }

}

export default UnexpectedInput;

MyApp.ts

import UnexpectedInput from "./UnexpectedInput";

...

throw new UnexpectedInput(UnexpectedInput.UNSUPPORTED_TYPE);

Pour les versions TypeScript antérieures à 1.8, vous devez déclarer Error:

export declare class Error {
  public message: string;
  public name: string;
  public stack: string;
  constructor(message?: string);
}
13
Benny Neugebauer