Flow预测多态性的方式确实让我头疼。 Here's a minimum example来证明我遇到的麻烦。
我希望以下内容根据myPolymorphicAction.payload.key
的错误类型引发错误。相反,它在action
上窒息而不是多态类型。
Flow能否在这里说出不同之处?
/* @flow */
type normalAction = {
type: string,
payload?: any,
}
type polymorphicAction <P: *> = {
type: string,
payload: P,
}
type action = polymorphicAction<*> | normalAction;
const myAction: action = {
type: "Hello",
payload: { key: "World" }
};
const myPolymorphicAction: action<myActionPayloadType> = {
type: "Hello",
payload: { key: "World" }
}
type myActionPayloadType = {
key: number
}
// FLOW OUTPUT //
20: const myPolymorphicAction: action<myActionPayloadType> = {
^ object literal. Expected polymorphic type instead of
20: const myPolymorphicAction: action<myActionPayloadType> = {
^ type `action`
答案 0 :(得分:1)
预期的多态类型
表示您对不具有多态性的类型使用<...>
。由于您的action
是
type action = polymorphicAction<*> | normalAction;
流量正确,您的action
类型上没有<>
。你可以做到
type action<T> = polymorphicAction<T> | normalAction;
然后
const myAction: action<*> = {
// ...
const myPolymorphicAction: action<myActionPayloadType> = {
这将使Flow停止抛出您获得的错误,但这仍然不会导致您的"Hello"
字符串出错,因为您的操作有| normalAction
且normalAction
仍有{ {1}}允许任何有效载荷。