多态和非多态类型的联合

时间:2017-01-04 22:39:14

标签: javascript reactjs polymorphism flowtype

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`

1 个答案:

答案 0 :(得分:1)

  

预期的多态类型

表示您对不具有多态性的类型使用<...>。由于您的action

type action = polymorphicAction<*> | normalAction;

流量正确,您的action类型上没有<>。你可以做到

type action<T> = polymorphicAction<T> | normalAction;

然后

const myAction: action<*> = {
// ...
const myPolymorphicAction: action<myActionPayloadType> = {

这将使Flow停止抛出您获得的错误,但这仍然不会导致您的"Hello"字符串出错,因为您的操作有| normalActionnormalAction仍有{ {1}}允许任何有效载荷。