2017-01-04 21 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; 

Flow правильно, ваш action тип не имеет <> на нем. Вы могли бы сделать

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

и затем

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

который сделает Flow прекратить бросать ошибку вы получаете, но это еще не привести к ошибкам на вашей "Hello" строки, потому что ваши действия имеют | normalAction и normalAction все еще имеет payload?: any,, который позволит любой полезной нагрузке.