在JavaScript中是没有枚举的概念的TS帮我们定义了枚举这个类型

使用枚举 通过enum关键字定义我们的枚举

1. 数字枚举

例如 红绿蓝 Red = 0 Green = 1 Blue= 2 分别代表红色0 绿色为1 蓝色为2

 //数字枚举
 //例如 红绿蓝 Red = 0 Green = 1 Blue= 2 分别代表红色0 绿色为1 蓝色为2
 ​
 //传统方法
 const fn = (type:string) => {
  if(type === 'red') {
      return 0
  }
  if(type === 'green') {
      return 1
  }
  if(type === 'blue') {
      return 2
  }
 }
 //枚举
 enum Color {
  //默认从零开始
  red,
  green,
  blue,
 }
 console.log(Color.red);
 console.log(Color.green);
 console.log(Color.blue);

image-20230106182423803

增长枚举

 //增长枚举
 enum Week{
  Mon=1,
  Tus,
  Wed,
  Thu=2,
  Fri,
  Sat,
  Sun
 }
 console.log(Week)

image-20230106190944588

如上,我们定义了一个数字枚举, Mon使用初始化为 1。 其余的成员会从 1开始自动增长。 Thu 定义为2,剩下的成员会从2开始自动增长

2. 字符串枚举

字符串枚举的概念很简单。 在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。

 //字符串枚举
 enum Car {
  Red = '红色',
  Green = '绿色',
  Blue = '蓝色',
 }
 console.log(Car)

image-20230106191316338

由于字符串枚举没有自增长的行为,字符串枚举可以很好的序列化。 换句话说,如果你正在调试并且必须要读一个数字枚举的运行时的值,这个值通常是很难读的 - 它并不能表达有用的信息,字符串枚举允许你提供一个运行时有意义的并且可读的值,独立于枚举成员的名字。

3. 异构枚举

枚举可以混合字符串和数字成员

 enum Types {
  No = "No",
  Yes = 1,
 }

4.接口枚举

定义一个枚举Types2 定义一个接口A 他有一个属性red 值为Types2.yyds

声明对象的时候要遵循这个规则

 enum Types2 {
  yyds,
  dddd
 }
 interface A {
  red:Types2.yyds
 }
 let obj:A = {
  // red:Types2.dddd     //报错
  red:Types2.yyds
 }

image-20230106192637143

5. const枚举

let 和 var 都是不允许的声明只能使用const

大多数情况下,枚举是十分有效的方案。 然而在某些情况下需求很严格。 为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问,我们可以使用 const枚举。 常量枚举通过在枚举上使用 const修饰符来定义

const 声明的枚举会被编译成常量

普通声明的枚举编译完后是个对象

 const enum Types3{
  No = "No",
  Yes = 1,
 }
 let ccc = Types3['No']
 console.log(ccc)

编译后的结果:

image-20230106195120956

普通声明编译后:

image-20230106195213559

6. 反向映射

它包含了正向映射( name -> value)和反向映射( value -> name

要注意的是 不会为字符串枚举成员生成反向映射。

 //反向映射
 enum Enum {
  fall
 }
 let a = Enum.fall   //name -> value
 console.log(a)  //输出0
 let name0fA = Enum[a]   //value -> name
 console.log(name0fA)    //输出fall

image-20230106195425585