2016-11-29 91 views
5

我在打字稿定義的自定義類型:如何迭代打字稿中的自定義類型?

export type Market = 'au'|'br'|'de'; 

現在我想遍歷每個可能Market,而不必首先創建的Market[]數組作爲它感覺冗餘和予可能會忘記添加一個選項:

const markets: Market[] = ['au', 'br', 'de']; 
markets.forEach((market: Market) => { 
    console.log(market); 
}); 

有沒有一種方法來實現與打字稿?

+1

這是不可能的,但我真的希望TS團隊可以在運行時添加類似內省的東西。 – Paleo

+0

整個類型別名(和接口)的要點是它們不會被編譯爲javascript。如果你只想編譯一些東西,那麼你可以使用它,但是如果你需要它來運行,那麼你必須使用js中存在的東西。 –

回答

2

不,您不能這樣做,因爲純粹的類型信息在運行時不存在。

假設其他方式可行(定義一個正常的字符串列表,然後從中得到'au'|'br'|'de'類型),但我不認爲TypeScript編譯器(2.0或2.1)會推斷出你 - 據我所知,市場的類型通常是string[]

正確的答案是使用枚舉。他們用它們的每個值定義一個類型,並且可以得到它們所有字符串值的列表:How to programmatically enumerate an enum type in Typescript 0.9.5?

枚舉的一個缺點是它們的運行時表示不同(在引擎蓋下它們實際上是數字而不是字符串)。儘管如此,您的代碼仍然可以將它們視爲可讀的值,但只要將它們作爲字符串名稱在運行時需要,就必須將它們轉換爲字符串。這很容易:給定枚舉MarketEnum和值myEnumValue,MarketEnum[myEnumValue]是值的名稱作爲一個字符串)。