Flowtype错误。对象类型与字符串不兼容

时间:2017-07-29 18:52:40

标签: javascript flowtype

我写了一个小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;

1 个答案:

答案 0 :(得分:2)

The internal definition of Errormessage成员变量简单地键入为字符串。即使在子类化之后,基类(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)}`;
    }
}