我写了一个小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;
答案 0 :(得分:2)
The internal definition of Error
将message
成员变量简单地键入为字符串。即使在子类化之后,基类(Error
)仍然可能以某种方式与this.message
交互。如果您能够将其重新定义为字符串以外的任何内容,并且它尝试调用length
或concat
或String
类的其他成员,则会失败。因此,您不能覆盖子类的成员类型。
您可以尝试以下方式:
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)}`;
}
}