如何获得TypeScript枚举条目的名称?
我想知道如何迭代一个TypeScript枚举和每个枚举的符号名称。
例如,
enum myEnum { entry1, entry2 } for (var entry in myEnum) { // use entry's name here, eg, "entry1" }
您发布的代码将起作用; 它会打印出所有的枚举成员,包括枚举成员的值。 例如,下面的代码:
enum myEnum { bar, foo } for (var enumMember in myEnum) { console.log("enum member: ", enumMember); }
将打印以下内容:
Enum member: 0 Enum member: 1 Enum member: bar Enum member: foo
如果您只需要成员名称而不是值,则可以这样做:
for (var enumMember in myEnum) { var isValueProperty = parseInt(enumMember, 10) >= 0 if (isValueProperty) { console.log("enum member: ", myEnum[enumMember]); } }
这将打印出刚才的名字:
枚举成员:bar
枚举成员:foo
警告:这略有依赖于实现细节:TypeScript将枚举编译为JS对象,枚举值是对象的成员。 如果TS在未来决定实施它们,上述技术可能会被打破。
哇。 这样做比我想象的要容易得多,对我来说也没有任何意义。
enum myEnum { entry1, entry2 } console.log(myEnum[myEnum.entry1]); // Will output "entry1" to the console.
假设你坚持规则,只产生带有数值的枚举,你可以使用这个代码。 这正确处理的情况下,你有一个名字,巧合的是一个有效的数字
enum Color { Red, Green, Blue, "10" // wat } var names: string[] = []; for(var n in Color) { if(typeof Color[n] === 'number') names.push(n); } console.log(names); // ['Red', 'Green', 'Blue', '10']
虽然答案已经提供,有趣的是,几乎没有人指出它有很多其他很酷的信息
这是一个片段
enum Enum { A } let nameOfA = Enum[Enum.A]; // "A"
对于我来说,一个更简单,实用和直接的方法来理解正在发生的事情,就是下面的列举:
enum colors { red, green, blue };
将基本上转换为:
var colors = { red: 0, green: 1, blue: 2, [0]: "red", [1]: "green", [2]: "blue" }
因此,以下将是真实的:
colors.red === 0 colors[colors.red] === "red" colors["red"] === 0
这创build了一个简单的方法来获得枚举的名称,如下所示:
var color: colors = colors.red; console.log("The color selected is " + colors[color]);
它也创build一个很好的方式来将string转换为枚举值。
var colorName: string = "green"; var color: colors = colors.red; if (colorName in colors) color = colors[colorName];
上述两种情况是非常普遍的情况,因为通常情况下,您更感兴趣的是特定值的名称和序列化值。
使用当前的TypeScript 1.8.9版本,我使用键入的枚举:
export enum Option { OPTION1 = <any>'this is option 1', OPTION2 = <any>'this is option 2' }
结果在这个Javascript对象中:
Option = { "OPTION1": "this is option 1", "OPTION2": "this is option 2", "this is option 1": "OPTION1", "this is option 2": "OPTION2" }
所以我必须通过键和值查询,只返回值:
let optionNames: Array<any> = []; for (let enumValue in Option) { let optionNameLength = optionNames.length; if (optionNameLength === 0) { this.optionNames.push([enumValue, Option[enumValue]]); } else { if (this.optionNames[optionNameLength - 1][1] !== enumValue) { this.optionNames.push([enumValue, Option[enumValue]]); } } }
我收到一个数组中的选项键:
optionNames = [ "OPTION1", "OPTION2" ];
如果您只search名称并稍后重复使用:
Object.keys(myEnum).map(key => myEnum[key]).filter(value => typeof value === 'string') as string[];
当我遇到同样的问题时,可以使用我编写的enum-values
包:
Git:枚举值
var names = EnumValues.getNames(myEnum);
这个解决scheme也工作。
enum ScreenType { Edit = 1, New = 2, View = 4 } var type: ScreenType = ScreenType.Edit; console.log(ScreenType[type]); //Edit
我发现解决scheme更优雅:
for (let val in myEnum ) { if ( isNaN( parseInt( val )) ) console.log( val ); }
它显示:
bar foo
- 用于导入commonjs / amd模块的新的es6语法,例如`import foo = require('foo')`
- 在接口定义中可以使用getters / setter吗?
- 在TypeScript中使用jQuery插件
- TypeScript – 如何保持编译的文件在一个单独的目录?
- 如何在rxjs中返回一个空的observable
- Angular 2 2.0.0-rc.1属性'map'在types'Observable <Response>'上不存在与问题报告不一样
- Angular 2组件中的“private”和“public”
- 何时在TypeScript / Angular2中使用接口和模型
- TypeScript,通过字典循环