Пользовательский класс ошибок в 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);
}