枚举和常量枚举

200 阅读2分钟

示例

// 枚举
enum Colors {
  Red, 
  Green, 
  Blue
}

// 可以在运行时通过枚举属性访问成员
let colorName = Colors[Colors.Red]; // 'Red'

// 可以迭代枚举成员
for (let color in Colors) {
  console.log(color); // 'Red', 'Green', 'Blue'
}


// 常量枚举
const enum Colors {
  Red = 1, 
  Green, 
  Blue 
}

// 错误,不能在运行时访问常量枚举
let colorName = Colors[Colors.Red]; 

// 错误,不能迭代常量枚举
for (let color in Colors) {
  console.log(color);
}

编译后产物

image.png

常量枚举 Colors 在编译结果中会被删除,编译成直接使用成员值。

常量枚举 Colors 在编译结果中会被删除,编译成直接使用成员值。

常量枚举 Colors 在编译结果中会被删除,编译成直接使用成员值。

区别

在TypeScript中,枚举(enum)和常量枚举(const enum)的主要区别在于:

  1. 枚举会生成对应的代码,而常量枚举只在编译阶段存在,编译结果中会在使用的地方直接替换成枚举成员的值。
  2. 枚举可以在运行时通过枚举的属性访问枚举成员。常量枚举不可以在运行时访问,它会在编译阶段被删除。
  3. 枚举会为每个枚举成员生成一个值。常量枚举的成员值需要手动初始化。
  4. 枚举可以被迭代,而常量枚举由于只在编译阶段存在,不能被迭代。

使用场景

  1. 当枚举只用作类型标记,而枚举成员仅供编译时使用时,可以使用常量枚举,这样可以减小编译后的代码大小。
  2. 当需要在运行时访问或迭代枚举成员时,必须使用普通枚举。
  3. 当枚举需要动态计算或修改成员值时,必须使用普通枚举。
  4. 如果需要枚举值跨文件可见时,推荐使用常量枚举,因为它不会生成代码,可以避免可能的命名冲突。

总结

所以简单来说,如果只需要编译时的枚举信息,不需要运行时访问,可以使用常量枚举;否则使用普通枚举。