2017-08-29 145 views
2

與此question類似,但枚舉標記爲常量:你如何去從常量枚舉中迭代或生成一個數組?是否有可能在Typescript迭代一個常量枚舉?

declare const enum FanSpeed { 
    Off = 0, 
    Low, 
    Medium, 
    High 
} 

Desireable結果

type enumItem = {index: number, value: string}; 
let result: Array<enumItem> = [ 
    {index: 0, value: "Off"}, 
    {index: 1, value: "Low"}, 
    {index: 2, value: "Medium"}, 
    {index: 3, value: "High"} 
]; 

回答

2

沒有,這是不可能用const enum。讓我們先從原來的枚舉並記錄其價值之一:

const enum FanSpeed { 
    Off = 0, 
    Low, 
    Medium, 
    High 
} 

console.log(FanSpeed.High); 

打字稿編譯器內聯所有FanSpeed引用,並編譯上面的代碼弄成這個樣子:

console.log(3 /* High */); 

換句話說,因爲您使用const enum,所以在運行時實際上不存在FanSpeed對象,只是傳遞簡單的數字文字。使用常規非常量enumFanSpeed將作爲值存在,您可以遍歷其鍵。

編輯:如果你可以改變你的項目的編譯器設置,請參閱Titian's answer below有關preserveConstEnums標誌非常有用的信息,這將導致一個FanSpeed對象其實是可以創造的,因此給你一個方法來迭代您枚舉。

+0

真的很感謝你對此的閃電反應!有用的見解! – Jim

+0

是否可以使用preserveConstEnums編譯器標誌來保存常量枚舉 –

+0

是的,提到@ TitianCernicova-Dragomir非常重要。我鏈接到你的回答,我的答案,以便他們看到你寫的關於'preserveConstEnums' – JKillian

2

您可以使用preserveConstEnums編譯器標誌。這將在Javascript中發出枚舉對象,但替換所有值。問題在於,您無法以簡單的方式在屬性上輸入for,因爲Typescript會生成錯誤(enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment.)。有辦法解決它,但這取決於你的環境。 使用的模塊,你可以寫這樣的:

import * as e from "./enumModule" 

for(var prop in (e as any)['FanSpeed']) { 
    console.log(prop) ; 
} 

或使用命名空間,你可以做這樣的:

namespace Enums { 
    export const enum FanSpeed { 
     Off = 0, 
     Low, 
     Medium, 
     High 
    } 
} 
for(var prop in (Enums as any)['FanSpeed']) { 
    console.log(prop) ; 
} 

注:在這兩種情況下,你必須首先使用preserveConstEnums編譯器選項,

相關問題