基于if属性存在的流不相交联合

时间:2018-05-07 09:20:27

标签: flow

我想知道是否有任何方法可以根据属性是否存在来改进不相交的联合,如下所示:

type Success = {| success: string |};
type Failed = {| error: string |};

type Response = Success | Failed;

function handleResponse(response: Response) {
  if (response.hasOwnProperty('success')) {
    // It is a Success
    var value: string = response.success;
  } else {
    // It is an Error
    var message: string = response.error;
  }
}

此代码给出了以下错误:

11:     var value: string = response.success;
                                     ^ Cannot get `response.success` because property `success` is missing in `Failed` [1].
References:
8: function handleResponse(response: Response) {
                                     ^ [1]
14:     var message: string = response.error;
                                       ^ Cannot get `response.error` because property `error` is missing in `Success` [1].
References:
8: function handleResponse(response: Response) {
                                     ^ [1]

我想确定如果第一个if语句为true,则响应为Sucess,否则为Error而不更改Success或Failed类型。

Try Link

1 个答案:

答案 0 :(得分:0)

你想要的方式是不可能的。关于你在GitHub上想要什么的讨论Here's an example

你上面提供的实际上并不是一个不相交的联盟,它只是一个联盟。使用区分两者的共享prop将是一个不相交的联合,并且可以进行类型细化。这是一个Try Link