2017-01-19 116 views
4

是否有任何方法來循環TypeScript字符串文字的值?枚舉TypeScript字符串文字

type category = "foo" | "bar" | "baz" | "xyzzy" 

for (c in category) { 
    // ... do something with each category 
} 

我現在有這樣的事情:

let cat: category = ... 

switch (cat) { 
    case "foo": 
    default: 
     process("foo") 
     break 

    case "bar": 
     process("bar") 
     break 

    case "baz": 
     process("baz") 
     break 

    case "xyzzy": 
     process("xyzzy") 
     break 
} 

,但我寧願使用類似

let others: category = [] 
for (c in category) {  // Iterate over possible category values 
    if (c !== "foo") others.push(c) 
} 

if (others.indexOf(cat) >= 0) { 
    process(cat) 
} else { 
    process("foo") 
} 
+0

'讓別人:類別= [「foo」,「bar」,「baz」,「xyzzy」]' –

+1

我試圖找到一種乾式方法來將類別保留在一個地方,而不必在別人的定義中重複。 – Ralph

回答

8

隨着打字稿2.1和keyof type,有可能圓做其他方式 - 你可以使用keyof定義一個對象,具有必要的密鑰,並獲得聯合類型的所有鍵:

let categoryKeys = {foo: '', bar: '', baz: '', xyzzy: ''}; // values do not matter 

type category = keyof typeof categoryKeys; 

let x: category = 'foo'; // ok 
let z: category = 'z'; // error TS2322: Type '"z"' is not assignable 
         // to type '"foo" | "bar" | "baz" | "xyzzy"'. 

console.log(Object.keys(categoryKeys)); // prints [ 'foo', 'bar', 'baz', 'xyzzy' ] 
4

這是類型聲明。

type category = "foo" | "bar" | "baz" | "xyzzy" 

TypeScript轉換爲JavaScript沒有類型。 TypeScript中的類型只是關於可能的特定值(在這種情況下)的轉譯器的信息。並且類型聲明不會被編譯到任何真正的運行時JavaScript對象中。因此你不能迭代它,但你可以在開關構造中使用它。

+0

話雖如此,編譯時編譯器在技術上有可能將一些特殊的語法('arrayof category'?)轉換爲一個字面數組('[「foo」,「bar」,...]),但是在那裏當前絕對不是這樣的特徵,可能會認爲這不符合打字稿的原則。 –