Пользовательский класс ошибок в TypeScript

Я хотел бы создать свой собственный класс ошибок в TypeScript, расширяя core Error, чтобы обеспечить лучшую обработку ошибок и настраиваемую отчетность. Например, я хочу создать класс HttpRequestError с URL-адресом, ответом и телом, переданным в его конструктор, который отвечает запросом Http на http://example.com не удалось с кодом состояния 500 и сообщением: что-то пошло не так и правильная трассировка стека.

Как расширить основной класс ошибок в TypeScript? Я уже нашел сообщение в SO: Как расширить объект хоста (например, Ошибка) в TypeScript, но это решение не работает для меня. Я использую TypeScript 1.5.3

Любые идеи?

Ответ 1

До тех пор пока 1.6 не свернут, я только что делал свои собственные расширяемые классы.

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
);

Ответ 2

TypeScript 2.1 произошли изменения в отношении расширения встроенных модулей, таких как Ошибка.

Из TypeScript отменить документацию об изменениях

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

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

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

Затем вы можете использовать:

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

Ответ 3

Я использую TypeScript 1,8, и именно так я использую собственные классы ошибок:

UnexpectedInput.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);

Для TypeScript версий старше 1.8 вам нужно объявить Error:

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