2017-01-04 24 views
0

流れが多型を予期する方法は、本当に私に頭痛を引き起こしています。 Here's a minimum example私は持っている問題を実証する。多型と非多型の連合

myPolymorphicAction.payload.keyのタイプが間違っているため、次のようなエラーが発生することがあります。代わりに、actionが多態型ではないと窒息しています。

ここで違いは分かるのですか?

/* @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

予想されるポリモーフィック型の

は、あなたが多型でないタイプに<...>を使用していることを意味します。あなたのaction

type action = polymorphicAction<*> | normalAction; 

フローであることは正しいですので、あなたのactionタイプはそれに<>を持っていません。あなたは

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

とを行うことができ、その後の流れは、あなたが取得しているエラーを投げて止めるようになりますが、それはまだあなたのアクションが| normalActionを持っているので、それはあなたの"Hello"文字列にエラーすることはありません

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

normalActionはまだペイロードを許可する payload?: any,を持っています。