FlowJs:如何输入谓词函数?

时间:2018-03-02 05:54:47

标签: redux flowtype

我试图在我的应用程序中实现某种通用的redux reducer,它应该处理带有流类型的错误flux standard actions

假设我有FSA的Flowtype定义:

type Action<P, M = void> = {
  type: string,
  payload: P,
  meta?: M,
  error?: boolean
}

P可能是错误的实例。另外,我有自定义predicate function来检测错误操作:

function isErrorAction<P, M>(a: Action<P, M>): boolean %checks {
  return a.payload instanceof Error;
}

正如文档中提到的,这个函数的主体是简单的表达式。

最后,我有一个简单的通用操作处理程序:

function handle(a: Action<string | Error>) {
  if (isErrorAction(a)) {
    console.log(a.payload.message);
  }
}

但Flowtype抱怨:

console.log(a.payload.message);
                              ^ Cannot get `a.payload.message` because property `message` is missing in `String` [1].

当我在动作处理程序中内联谓词函数时,一切正常。所以我可能错过了关于谓词函数的一些内容。

[try it out]

1 个答案:

答案 0 :(得分:2)

在你的原始例子中,我认为这是Flow的谓词函数的失败,当主语是参数时似乎工作得很好,但是当它是参数的成员时它似乎没有。

然而,似乎你需要一些语法糖,在这种情况下,Disjoint Unions来救援!

注意:您必须在使用前测试payloaderror是否存在(真实),否则它会警告它可能正在处理另一种类型,因此在访问{{1 }}

Try it out

a.payload