多态和非多态类型的联合

Union of Polymorphic and Non-Polymorphic Types

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`

Expected polymorphic type

表示您在非多态类型上使用 <...>。因为你的action

type action = polymorphicAction<*> | normalAction;

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

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

然后

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

这将使 Flow 停止抛出您收到的错误,但这仍然不会导致它在您的 "Hello" 字符串上出错,因为您的操作仍然有 | normalActionnormalAction payload?: any, 允许任何负载。