2016-08-02 316 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