web-dev-qa-db-ja.com

TypeScriptのカスタムエラークラス

TypeScriptで独自のエラークラスを作成し、コアErrorを拡張して、より優れたエラー処理とカスタマイズされたレポートを提供したいと思います。たとえば、url、response、およびbodyをコンストラクタに渡したHttpRequestErrorクラスを作成します。コンストラクタは、 http://example.comへのHttpリクエストで応答します) ステータスコード500およびメッセージで失敗しました:何かがおかしくなりましたおよび適切なスタックトレース。

TypeScriptのコアエラークラスを拡張する方法?私はすでにSOで投稿を見つけました: TypeScriptでホストオブジェクト(たとえば、エラー)を拡張するにはどうすればよいですか しかし、この解決策は私にはうまくいきません。 TypeScript 1.5.3を使用します

何か案は?

40
Kuba T

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

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();
}
87
ziv

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