Flow - 在缓存公共变量检查时读取联合类型属性不起作用

时间:2018-03-14 00:00:27

标签: flowtype

this example中,Flow向我们展示了一种根据类型读取属性的方法。

我已经重构它看起来像这样,它按预期工作:

type Success = { success: true, value: boolean };
type Failed  = { success: false, error: string };

type Response = Success | Failed;

function handleResponse(response: Response) {
  const value = response.success && response.value;
  const error = !response.success && response.error;
}

但是,当common属性是一个字符串时,它在执行===检查时有效,但如果将检查缓存到变量中则不行:

type Success2 = { success: 'success', value: boolean };
type Failed2  = { success: 'not_success', error: string };

type Response2 = Success | Failed;

function handleResponse(response: Response2) {
  const isSuccess = response.success === 'success';

  // const value = response.success === 'success' && response.value;  // WORK

  const value = isSuccess && response.value;  // DOESN'T WORK
}

换句话说,在读取变量之前必须进行===检查(字面意思),不能将它放在变量中。

这是一个已知的Flow限制,还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

是的,这是预期的行为。您在此处引用的功能是type refinement。该实现基于Javascript的标准流控制机制,这意味着保存测试结果并在以后使用它将丢弃Flow可能能够推断的类型信息。所有Flow在你的非工作示例中都知道isSuccess是一个布尔值,它不知道true暗示response.value存在。