簡體   English   中英

Flowtype:需要可選屬性的子類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM