获取区分联合类型的错误(“在对象类型中找不到属性”)

时间:2017-09-27 12:32:39

标签: javascript flowtype

我很难描述函数参数的类型,它是成功或错误api响应。以下是该问题的一个简单令人费解的例子(在this address中的TryFlow中再现)

该函数可以采用成功响应对象或错误响应对象:

export type ErrorResponse = {
 error: {
   message: string,
 }
}

export type SuccessResponse = {
 token: {
   id: string,
 }
}

然后它应该决定它是哪种响应并将响应传递给handleSuccesshandleError函数:

function onSubmit(response: SuccessResponse | ErrorResponse) {
  if (response.error) {
    handleError(response);
  } else {
    handleSuccess(response);
  }
}

function handleError(response: ErrorResponse) {
  console.log(response.error.message);
}

function handleSuccess(response: SuccessResponse) {
  console.log(response.token.id);
}

问题是,Flow正在发出错误:

23: function handleError(response: ErrorResponse) {
                                   ^ property `error`. Property not found in
17:     handleError(response);
                    ^ object type

如果不是联合类型(SuccessResponse | ErrorResponse),则错误消失我将响应对象键入为交集类型(SuccessResponse & ErrorResponse),但这不是正确的 - 我没有进入onSubmit函数是一个对象,它具有两种类型的所有属性,但参数可以是两种类型的

请您解释一下我做错了什么,并建议如何解决这个输入错误?

2 个答案:

答案 0 :(得分:2)

您遇到的问题是Flow不知道SuccessResponse是否有可能额外的error参数。

要告诉Flow它没有,你可以exact Object types

export type ErrorResponse = {|
  error: {
    message: string,
  },
|}

export type SuccessResponse = {|
  token: {
    id: string,
  },
|}

答案 1 :(得分:0)

要访问联合中所有类型不常见的成员,您必须为流提供一种方式来查看它正在处理的类型。我了解您正在尝试使用error的真实性来确定具体类型,但流程并不理解这一点。

用于这种情况的模式流程用于称为"不相交的联合"。这里描述:https://flow.org/en/docs/types/unions/

我不是流量专家,但似乎有一个解决方案是修改SuccessResponse的类型定义,如下所示:

export type SuccessResponse = {
  error: typeof undefined,
  token: {
    id: string,
  }
}