2016-09-27 45 views
1

我正在與the following type definitions inside of Flow's try tool一起工作,我看到使用嵌套在工會內部的交叉點時有點奇怪的行爲。期待類型錯誤工會與交叉點

type Transition = SimpleTransition | BranchingTransition | LoopingTransition; 

type SimpleTransition = { 
    type: 'transition', 
    next?: string 
} 

type BranchingTransition = SimpleTransition & { 
    branch: Branch[] 
} 

type LoopingTransition = SimpleTransition & { 
    loop: Loop 
} 

type Branch = { 
    to: string, 
    when: string 
} 

type Loop = { 
    limit: number 
} 

我期待看到一個類型的錯誤,當我試圖創建一個Transition包含一個不匹配的屬性的它的聯合類型之一。

let t: Transition = { 
    type: 'transition', 
    branch: false // <- expecting type error (boolean != Branch[]) 
} 

我希望在branch財產列入將使類型檢查要檢查BranchingTransition這個對象(然後找到booleanBranch[]之間的類型不匹配,而是它似乎只是算作一個SimpleTransition與外來屬性。

我想知道這是否只是因爲SimpleTransition是第一個聯合類型,它是能夠與統一,但在工會改變類型的順序似乎沒有任何效果。

有趣的是,當我從工會移除SimpleTransition時,它工作得很好(although the error message is somewhat confusing)。有沒有一種方法來構造這些類型以防止發生這種問題?

回答

0

流量行爲正確,因爲

({ 
    type: 'transition', 
    branch: false 
}: SimpleTransition) 

可以使用​​型(流量0.32+)

type Transition = $Exact<SimpleTransition> | BranchingTransition | LoopingTransition; 

或寫你自己的當量(流量0.31-)縮小類型

type Strict<T> = $Shape<T> & T; 
type Transition = Strict<SimpleTransition> | BranchingTransition | LoopingTransition;