2016-08-02 202 views
3

在Typescript中,我得到一個string變量,其中包含我定義的enum的名稱。通過枚舉名字符串獲取枚舉值

我現在該如何獲得此枚舉的所有值?

+0

你可以使用反射,像這樣的東西http://stackoverflow.com/questions/15338610/dynamically-loading-a-typescript-class-re撓曲換打字稿。無論如何,我首先會想,如果這是正確的方式,或者你可以以「正常」的方式訪問它 – iberbeu

回答

5

打字稿枚舉:

enum MyEnum { 
    First, Second 
} 

被transpiled到JavaScript對象:

var MyEnum; 
(function (MyEnum) { 
    MyEnum[MyEnum["First"] = 0] = "First"; 
    MyEnum[MyEnum["Second"] = 1] = "Second"; 
})(MyEnum || (MyEnum = {})); 

您可以從window["EnumName"]得到enum例如:

const MyEnumInstance = window["MyEnum"]; 

接下來你可以用枚舉成員的值:

const enumMemberValues: number[] = Object.keys(MyEnumInstance) 
     .map((k: any) => MyEnumInstance[k]) 
     .filter((v: any) => typeof v === 'number').map(Number); 

而枚舉成員與名稱:

const enumMemberNames: string[] = Object.keys(MyEnumInstance) 
     .map((k: any) => MyEnumInstance[k]) 
     .filter((v: any) => typeof v === 'string'); 

也見How to programmatically enumerate an enum type in Typescript 0.9.5?

+0

窗口[enumname]不起作用,也許是因爲我們使用命名空間。但「eval(enumname)」確實有效。 –

2

作爲替代window的辦法,其他的答案提供,你可以做到以下幾點:

enum SomeEnum { A, B } 

let enumValues:Array<string>= []; 

for(let value in SomeEnum) { 
    if(typeof SomeEnum[value] === 'number') { 
     enumValues.push(value); 
    } 
} 

enumValues.forEach(v=> console.log(v)) 
//A 
//B