Typescript是否可以遍历const枚举?

Jim*_*Jim 9 enums typescript

与此问题类似,但枚举标记为常量:如何从const枚举中迭代或产生一个数组?

declare const enum FanSpeed {
    Off = 0,
    Low,
    Medium,
    High
}
Run Code Online (Sandbox Code Playgroud)

理想的结果

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"}
];
Run Code Online (Sandbox Code Playgroud)

JKi*_*ian 7

不可以,用不可能const enum。让我们从原始的枚举开始,并记录其值之一:

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

console.log(FanSpeed.High);
Run Code Online (Sandbox Code Playgroud)

TypeScript编译器将对的所有引用内联FanSpeed,并将上述代码编译为如下形式:

console.log(3 /* High */);
Run Code Online (Sandbox Code Playgroud)

换句话说,由于您使用const enumFanSpeed在运行时实际上不存在任何对象,因此仅传递了简单的数字文字。使用常规的非const时enum,a FanSpeed将作为值存在,您可以遍历其键。

编辑:如果可以更改项目的编译器设置,请参见下面的Titian答案,以获取有关该preserveConstEnums标志的非常有用的信息,这将导致FanSpeed实际创建对象,从而为您提供遍历枚举的方法。

  • 可以使用preserveConstEnums编译器标志来保留常量枚举 (2认同)
  • 正如我在我的答案中提到的@Jim,它使用了客房表的encount对象,但是访问它有点棘手,因为编译器坚持认为它不存在。 (2认同)

Tit*_*mir 5

您可以使用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) ;
}
Run Code Online (Sandbox Code Playgroud)

或者使用命名空间,你可以这样做:

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

注意:无论哪种情况,您都必须首先使用 preserveConstEnums 编译器选项,