TypeScriptで独自のエラークラスを作成し、コアError
を拡張して、より優れたエラー処理とカスタマイズされたレポートを提供したいと思います。たとえば、url、response、およびbodyをコンストラクタに渡したHttpRequestError
クラスを作成します。コンストラクタは、 http://example.comへのHttpリクエストで応答します) ステータスコード500およびメッセージで失敗しました:何かがおかしくなりましたおよび適切なスタックトレース。
TypeScriptのコアエラークラスを拡張する方法?私はすでにSOで投稿を見つけました: TypeScriptでホストオブジェクト(たとえば、エラー)を拡張するにはどうすればよいですか しかし、この解決策は私にはうまくいきません。 TypeScript 1.5.3を使用します
何か案は?
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
);
TypeScript 2.1には、エラーなどの組み込みの拡張に関する重大な変更がありました。
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();
}
TypeScript 1.8を使用していますが、これがカスタムエラークラスの使用方法です。
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);
1.8より古いTypeScriptバージョンの場合、Error
を宣言する必要があります。
export declare class Error {
public message: string;
public name: string;
public stack: string;
constructor(message?: string);
}