枚举是对 js 标准数据类型的补充,声明一组带名字的常量

const test = 1
const getIndex = () => {
  return 2
}
enum Status {
  Uploading = 3,
  Success = test,
  Failed = getIndex()
}
console.log(Status.Uploading)

枚举作为类型使用的情况

  • 不带初始值的枚举成员 emun A {}
  • 值为字符串字面量 emub B {a='a'}
  • 值为数值字面量 enmu C {c=-1}
enum Animal {
  DOG = 'dog',
  CAT = 'cat'
}
interface Dog {
  type: Animal.DOG
}
const dog: Dog = {
  // type:Animal.CAT,// 类型不匹配
  type: Animal.DOG
}

联合枚举类型

enum Value {
  Off,
  On
}
interface Light {
  status: Value
}
const light: Light = {
  status: Value.On
}

枚举的特点

数字枚举经过编译之后会生成 lookup table (反向映射表),即除了生成键值对的集合,还会生成值键对的集合。

const 枚举

// 修饰符 + 关键词 + 枚举名称
const enum NumEnum { a, b, c }
// 上述声明了一个常量枚举,并且内部的数据均为只读常量
// const 枚举不会生成 lookup table,并且运行时不可访问当前枚举对象,只允许访问枚举成员的值;
const OBJ = NumEnum => Error,运行时不存在
function returnNumber (obj: { a: number }): number {
  return obj.a
}
returnNumber(NumEnum) => Error,运行时不存在
const A = NumEnum['0'] => Error,没有生成反向映射,所以不存在该属性
const B = NumEnum['b'] => 0/* b */
// 基于 const 枚举的特点,如果你只是为了生成一组常量并且只需要获取某一个常量
// 从性能方面考虑,const 枚举是首选;
// 当然如果你在 tsconfig.json 中指定下面选项
"compilerOptions": {
  // 保留 const 和 enum 声明该项为 true
  "preserveConstEnums": true
}
// 或者在命令行中添加了 --preserveConstEnums 指令,均会让当前 const 枚举转变为普通枚举
// 即会生成反向映射表;在实际开发中,一般情况你可能需要禁止掉该项,除非想要用于调试;

爬。