首页 > 解决方案 > Flowtype:如果类型没有匹配的字段,则不相交的联合区分不起作用

问题描述

我有一个函数应该根据该参数上是否存在字段来以不同的方式处理它作为参数接收的对象。

我创建了以下示例(自己尝试) - 它是流类型文档中关于分离联合类型的示例的改编:

// @flow

type Success = { value: boolean };
type Failed  = { error: string };

type Response = Success | Failed;

function handleResponse(response: Response) {
  if (response.value) {
    var value = response.value;
  } else {
    var error = response.error; // Error!
  }
}

我在表示的行中得到的错误是:

Cannot get `response.error` because property `error` is missing in `Success` [1]. 

不幸的是,我没有具有不同值的共享密钥,这可以帮助我区分SuccessFailed对象。

或者有没有其他方法可以让它工作?

标签: javascripttypesflowtype

解决方案


您必须使用确切的类型。在下面关于具有精确类型的不相交联合部分中进一步说明。

必须添加确切的类型,|并且 if/else 必须变成 if/else if。此代码现在不再抛出任何错误(尝试新代码):

// @flow

type Success = {| value: boolean |};
type Failed  = {| error: string |};

type Response = Success | Failed;

function handleResponse(response: Response) {
  if (response.value) {
    var value: boolean = response.value;
  } else if (response.error) {
    var error: string = response.error; // Error!
  }
}

感谢@user11307804 向我指出这个答案!


推荐阅读