2017-02-16 107 views
9

自從發佈Flow 42以來,可以使用對象類型傳播 。 type TypeB = { ...TypeA };FlowType:類型的繼承(類型A是類型B的子集...)

我想這確實是初學者關於FlowType的問題類型,但我真的找不到滿足我的答案。

讓我們假設我有這種類型的

type A = { 
x: number 
} 

type B = { 
y: string 
} 

,現在我想基於A型和B,這樣的事情有另一種類型:

type C = { 
...A, 
...B, 
z: boolean 
} 

其恕我直言應該這樣解釋:

type C = { 
    x: number, 
    y: string, 
    z: boolean 
} 

但是這顯然不起作用。

你能給我一些建議或最佳做法嗎?非常感謝。

回答

8

這是一個常見的功能請求,它實際上是在路上。這裏的a commit實現類型傳播的解析。我不確定這個功能的時間表是什麼,但我相信它仍然在進行中。

現在,你可以在某些情況下使用交叉點類型(雖然他們沒有真正專爲這種使用情況,並可能導致混亂的問題):

type C = A & B & { 
    z: boolean 
} 

你可以,當然,也只是選擇現在複製屬性。這絕對是最簡單的事情,儘管我同意它有點難吃。

+0

非常感謝您的回答!很高興知道。 – jukben

0

我已驗證傳播是否按照您所期望的那樣工作,十字路口讓我遍佈各處。這是一個簡短的playground that shows flow type intersection failing to make a prop optional, whereas spread works

爲後人示例代碼:

// @flow 

export type Affiliation = { 
    id: string, 
} 

export type Address = { 
    address1: string, 
} 


export type BaseContact = { 
    id?: string, 
    addresses: Array<Address>, 
    affiliations?: Array<Affiliation>, 
} 

type C = BaseContact & { 
    addresses: Array<Address>, 
} 

type CC = { 
    ...BaseContact, 
    addresses?: Array<Address>, 
} 

type CCI = BaseContact & { 
    addresses?: Array<Address>, 
} 


class X {} 

const c: C = new X() // fails 
const cc: CC = new X() // fails 
const cci: CCI = new X() // works