首页 文章

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

提问于
浏览
0

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

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

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 函数传递给具有 all 属性的对象类型,但可以是两种类型的 either 的参数 .

你能解释我做错了什么,并建议如何解决这个打字错误?

2 回答

  • 2

    你得到的问题是Flow不知道 SuccessResponse 是否有可能的额外 error 参数 .

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

    export type ErrorResponse = {|
      error: {
        message: string,
      },
    |}
    
    export type SuccessResponse = {|
      token: {
        id: string,
      },
    |}
    
  • 0

    要访问联合中所有类型不常见的成员,您必须为流提供一种方法,以查看's dealing with. I understand that you'尝试使用 error 的真实性来确定特定类型,但流程不理解这一点 .

    用于这种情况的模式流用途称为"disjoint unions" . 它在这里描述:https://flow.org/en/docs/types/unions/

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

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

相关问题