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