簡體   English   中英

從Flow中的對象值定義Union Type

[英]Defining a Union Type from object values in Flow

我有這樣的枚舉:

const Filter = {
  ALL: 'ALL',
  COMPLETED: 'COMPLETED',
  UNCOMPLETED: 'UNCOMPLETED'
};

我想做的是聲明一個這樣的聯合類型:

type FilterType = Filter.ALL | Filter.COMPLETED | Filter.UNCOMPLETED

但是,這失敗了,但我不確定為什么。 根據Flow文檔

使用其屬性創建對象時,可在Flow中創建密封對象類型。 這些密封對象將知道您聲明它們的所有屬性及其值的類型。

所以,如果我正確讀取,Flow應該能夠從這些值創建一個類型。 相反,它失敗了:

Cannot use string as a type because string is a value. To get the type of a value use typeof.

這里是一個Flow Try的鏈接,帶有一個可能的解決方案(我不滿意)和其他無法成功的方法。

有一個更簡單的解決方案。 您可以使用$Values實用程序來獲取值類型的並集。 並且為了使流解析類型作為文字類型而不僅僅是string ,應該凍結對象:

const FilterA = Object.freeze({
  ALL: 'ALL',
  COMPLETED: 'COMPLETED',
  UNCOMPLETED: 'UNCOMPLETED'
});

type FilterTypeA = $Values<typeof FilterA>;


let a: FilterTypeA = FilterA.ALL; //OK
a = 'COMPLETED'; //OK

a = 'foo'; //$Expect error: string is incompatible with enum FilterTypeA

嘗試

此模式自0.60.0版本起作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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