在Typescript中可以迭代一个const枚举吗?

时间:2017-08-29 14:55:06

标签: typescript enums

与此question类似,但枚举标记为常量:如何从const枚举中迭代或生成数组?

示例

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

可取的结果

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 个答案:

答案 0 :(得分:4)

不,const enum FanSpeed { Off = 0, Low, Medium, High } console.log(FanSpeed.High); 无法做到这一点。让我们从您的原始枚举开始并记录其中一个值:

FanSpeed

TypeScript编译器内联对console.log(3 /* High */); 的所有引用,并将上面的代码编译成如下代码:

const enum

换句话说,由于您使用的是FanSpeed,因此在运行时实际上不存在enum个对象,因此只传递简单的数字文字。对于常规的非常量FanSpeedpreserveConstEnums将作为值存在,您可以迭代其键。

编辑:如果您可以更改项目的编译器设置,请参阅Titian's answer below以获取有关FanSpeed标志的非常有用的信息,这将导致-removing实际创建对象,从而为您提供迭代枚举的方法。

答案 1 :(得分:2)

您可以使用preserveConstEnums编译器标志。这将在Javascript中发出枚举对象,但替换所有值。问题是,由于Typescript会生成错误(for),因此您无法以简单的方式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编译器选项,