我试图在我的应用程序中实现某种通用的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].
当我在动作处理程序中内联谓词函数时,一切正常。所以我可能错过了关于谓词函数的一些内容。
答案 0 :(得分:2)
在你的原始例子中,我认为这是Flow的谓词函数的失败,当主语是参数时似乎工作得很好,但是当它是参数的成员时它似乎没有。
然而,似乎你需要一些语法糖,在这种情况下,Disjoint Unions来救援!
注意:您必须在使用前测试payload
或error
是否存在(真实),否则它会警告它可能正在处理另一种类型,因此在访问{{1 }}
a.payload