2017-09-26 130 views
0

我剛碰到一個令我困惑的問題flow。有人可以向我解釋爲什麼以下不起作用,以及我將如何解決它?流聯合類型和可選屬性

// @flow 

type MessageDescriptor = { 
    id: string, 
    defaultMessage?: string, 
    description?: string 
}; 

type MenuLabel = MessageDescriptor & { 
    +values?: { +[name: string]: string } 
}; 

const msg: MessageDescriptor = { 
    id: 'test' 
}; 

const label: MenuLabel = msg; 

我得到的錯誤是:

9: type MenuLabel = MessageDescriptor & {           
             ^property `values`. Property not found in 

17: const label: MenuLabel = msg; 
          ^object type 

然而,values顯然是可選的。更奇怪的是,以下工作:

const label: MenuLabel = { ...msg }; 

回答

0

看起來,爲了使「交集類型+自選」工作,你必須定義在這兩種類型的可選值。

// @flow 

type MessageDescriptor = { 
    id: string, 
    defaultMessage?: string, 
    description?: string, 
    +values?: { +[name: string]: string } 
}; 


type MenuLabel = MessageDescriptor & { 
    +values?: { +[name: string]: string } 
}; 

const msg: MessageDescriptor = { 
    id: 'test' 
}; 

const label: MenuLabel = msg; 

鑑於評論,也許你正在尋找一個聯盟類型,而不是一個交集類型?

// @flow 

type MessageDescriptor = { 
    id: string, 
    defaultMessage?: string, 
    description?: string, 
}; 


type MenuLabel = MessageDescriptor | { 
    +values?: { +[name: string]: string } 
}; 

const msg: MessageDescriptor = { 
    id: 'test' 
}; 

const label: MenuLabel = msg; 
+0

不幸的是,這不是一個真正的解決方案,因爲它們來自不同的庫,所以我不能更改'MessageDescriptor'類型。 – Alxandr

+0

我看到,是不是一個聯盟類型而不是交叉類型? –

+0

不需要我需要以下內容才能生效'MenuLabel'值:'{id:'test',values:{foo:'bar'}}'' – Alxandr