2017-07-29 74 views
1

我寫了一個小的Javascript類,它有一個接受字符串或對象的參數。不過,我得到這個錯誤:Flowtype錯誤。對象類型與字符串不兼容

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只是{},但我沒有運氣。這是一個錯誤,還是我錯過了什麼?我正在使用流程箱^ 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進行交互。如果您能夠將其重新定義爲除字符串以外的任何其他字符,並且它試圖呼叫lengthconcatString類的某個其他成員,則它將失敗。因此你不能覆蓋子類的成員類型。

你可以嘗試,而不是像:

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

我做這個'超(JSON.stringify(消息));'在構造函數中。同樣的想法。 – Newtang

相關問題