2017-08-26 78 views
1

從流程的文檔,我們有這樣的:

// @flow 
const countries = { 
    US: "United States", 
    IT: "Italy", 
    FR: "France" 
}; 

type Country = $Keys<typeof countries>; 

const italy: Country = 'IT'; 
const nope: Country = 'nope'; // 'nope' is not a Country 

但是我想要做的

type CountryValue = $Values<typeof countries> 
const italy: CountryValue = 'Italy'; // yes 

這可能嗎?

回答

2

您可以使用$Values來排序,儘管您還需要多做一點,因爲目前countries中的值僅被檢測爲任何string。如果你告訴只有特定的值是允許的流量,那麼它的工作原理:

type FullNames = "United States" | "Italy"; 

const countries: {[key: string]: FullNames} = { 
    US: "United States", 
    IT: "Italy" 
}; 


const nope: $Values(typeof countries) = 'nope'; // 'nope' is not in the value type 

我猜想這是不是很你想要的東西,因爲它需要顯式地添加類型,但它是可行的。

+3

Ah darn,謝謝你,看來我必須定義'type FullNames'枚舉,所以不妨使用這個吧? – Blagoh

+0

是的,看起來它不會從對象字面值中推斷枚舉類型。哪種類型是有意義的,因爲大多數類型都有對象字面值,所以您不想將其限制爲初始值。 – Adam

+2

非常感謝您的幫助,我已經接受了這一點,因爲至少它的工作原理和傳達的信息是,它應該是該對象中的一個值,並確保該對象中的值來自給定的:) – Blagoh