Typescript中const enum和enum的区别

3,113 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

在TS中 enum(枚举) 和 const enum(常量枚举) 有什么区别?

在回答这个问题之前,我们需要先理解一下:

  • 什么是 枚举?
  • 平常怎么使用枚举?
  • enum(枚举) 和 const enum(常量枚举)的区别?

什么是 enum(枚举)

枚举是组织收集有关联变量的一种方式,许多程序语言(如:c/c#/Java)都有枚举数据类型。摘抄来自官方文档的话:

使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。

平常怎么使用枚举?

目前我自己的话,实际工作中用到的比较多的可能就是:

  • 数字类型枚举
  • 字符串类型 用的比较少,甚至没怎么用的
  • 异构枚举(Heterogeneous enums)

数字类型枚举

我们将数字类型赋值给枚举类型

enum Demo {
  a = 1,
  b = 2,
  c = 3
}
let test = Demo.a

如上,我们定义了一个数字枚举Demo,然后分别为:abc 进行了赋值。
换句话说, Demo.a的值为 1, b为 2, c为 3。
当然,我们还可以设置为自增

enum Demo {
  a = 2,
  b,
  c
}
let test = Demo.a

这样:Demo.a的值为 2, b为 3, c 为 4。

字符串枚举

字符串枚举的概念很简单,但是有细微的运行时的差别。 在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化

enum Demo {
  a = 'a',
  b =  'b',
  c = 'c'
}
let test = Demo.a

异构枚举(Heterogeneous enums)

混合字符串和数字成员,但是我觉得这样做实在是。。。。不太行,借用来自官网的一句话

除非你真的想要利用JavaScript运行时的行为,否则我们不建议这样做。

enum Demo {
    a = 0,
    b = "YES",
}

enum(枚举) 和 const enum(常量枚举)的区别

  1. 编译后不同
    • 常量枚举在编译阶段会被删除
    • 普通枚举并不会
const enum Demo1 {
  A = 'a',
  B = 'b',
}

enum Demo2 {
  A = 'a',
  B = 'b',
}

如图,我们可以看见,最终的编译结果就只有 Demo2 这个普通枚举的 image.png 2. 常量枚举不支持动态计算

const d = 111
const enum Demo1 {
  A = d * 1,
  B = d * 2,
}

enum Demo2 {
  A = d * 1,
  B = d * 2,
}

image.png 当然这也是因为常量枚举编译的特性,所以导致他不支持动态变量的计算:

当然,枚举内部的常量可以,因为枚举内部的常量支持自动推导。