2017-07-29 10 views
1

文字列またはオブジェクトのいずれかを受け付ける引数を持つ小さなJavascriptクラスを作成しました。しかし、私はこのエラーを取得する:フロータイプエラーです。オブジェクト型が文字列と互換性がありません

Error: utils/HttpError.js:8 
    8: message:string | ErrorObj 
         ^^^^^^^^ object type. This type is incompatible with 
512:  message: string; 
        ^^^^^^ string. See lib: /private/tmp/flow/flowlib_33322c59/core.js:512 

私はタイプの別名を使用して、ちょうど{}にErrorObjを簡素化していない試みたが、私は運がなかったしました。これはバグですか、何か不足していますか?私はflow-bin^0.51.0を使用しています。私のクラスは以下の通りです。

//@flow 
"use strict"; 

type ErrorObj = {[key:string]:Array<string>} 

class HttpError extends Error { 
    status:number 
    message:string | ErrorObj 
    constructor(status:number, message: string | ErrorObj){ 
     super(); 
     this.status = status; 
     this.message = message; 
    } 

    toString():string{ 
     return `status: ${this.status} message: ${JSON.stringify(this.message)}`; 
    } 
} 

module.exports = HttpError; 

答えて

2

The internal definition of Errorは、単に文字列として入力されたmessageメンバ変数を持っています。サブクラス化の後でさえ、基底クラス(Error)は何らかの形でまだthis.messageとやりとりするかもしれません。文字列以外に変更することができ、lengthまたはconcatまたはStringクラスの他のメンバーを呼び出そうとすると、失敗します。したがって、メンバータイプのサブクラスをオーバーライドすることはできません。コンストラクタで `;私はこの`スーパー(JSON.stringify(メッセージを))でした

type ErrorObj = {[key:string]:Array<string>} 

class HttpError extends Error { 
    status:number 
    _customMessage:string | ErrorObj 
    constructor(status:number, message: string | ErrorObj){ 
     super(typeof message === 'string' ? message : null); 
     this.status = status; 
     this._customMessage = message; 
    } 

    toString():string{ 
     return `status: ${this.status} message: ${JSON.stringify(this._customMessage)}`; 
    } 
} 
+0

代わりのようなものを試みることができます。同じ考え。 – Newtang

関連する問題