[英]Flowtype: Subtype that makes optional property required
給定以下Flow類型別名(請注意, payload
是一個可選屬性):
type Action = { type: string, payload?: any }
我將如何創建行動的一個亞型,其中payload
是不是可有可無的了嗎?
泛型不會讓我到處都是因為它只適用於payload
本身的類型,而不是它是可選的這一事實。 我希望能夠簡單地做到這一點:
type MoreSpecificAction extends Action = { payload: any }
使用我知道payload
不是可選的特定類型將允許我避免大量未定義的檢查。 作為獎勵,我可以使類型更具體,但我已經可以使用泛型實現。
正如劉易斯接受的答案中所解釋的那樣,解決方案是使用擴展運算符和$Exact<Action>
。 但是,babel-eslint目前不支持這種語法,但是有一種使用注釋的解決方法。 這是我的最終解決方案:
type LoadAttendeesAction = {
payload: Array<Attendee>,
/* :: ...$Exact<Action> */
};
需要注意的是, Action
需要在范圍內,但ESLint不會考慮使用它,因此您可能需要:
// eslint-disable-line no-unused-vars
這是合適的時間。 我剛剛在這里詢問了這個問題: https : //github.com/facebook/flow/issues/3534
你可以用你的方式做你想做的事:
type Action = {
type: string,
payload?: any
}
type MoreSpecificAction = {
payload: any,
...$Exact<Action>
}
請注意,目前,在這種情況下,似乎“向下轉換”不會報告錯誤(從Flow 0.44.1開始):
const y: Action = {
type: 'ACTION'
};
(y: MyAction);
但MoreSpecificAction
,您將能夠使用MoreSpecificAction
定義的MoreSpecificAction
編寫您的動作創建者和MoreSpecificAction
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.