多态和非多态类型的联合
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"
字符串上出错,因为您的操作仍然有 | normalAction
和 normalAction
payload?: any,
允许任何负载。
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"
字符串上出错,因为您的操作仍然有 | normalAction
和 normalAction
payload?: any,
允许任何负载。