分为数字枚举和字符串枚举 使用enum关键字定义

TypeScript

数字枚举

  1. // 数字枚举
  2. enum Role {
  3. Reporter,
  4. Developer,
  5. Maintainer,
  6. Owner,
  7. Guest,
  8. }
  9. console.log(Role.Reporter); // 0
  10. console.log(Role);

image.png

运行时,枚举被编译成一个对象,而且既可以使用枚举名称来索引,也可以用值来索引
数字枚举的值按照从上倒下递增+1,默认从0开始,当某一个成员被赋值后,后续+1

  1. enum Role {
  2. Reporter = 1,
  3. Developer,
  4. Maintainer,
  5. Owner,
  6. Guest,
  7. }
  8. console.log(Role.Reporter); // 1
  9. console.log(Role);

image.png
image.png
反向映射

  1. 枚举被编译为对象
  2. 枚举成员的名称被作为key, 枚举成员的值被作为value, 表达式返回value
  3. 然后,value又被作为key,成员名称又被作为value,返回枚举成员的名称

字符串枚举

  1. // 字符串枚举
  2. enum Message {
  3. Success = "恭喜你,成功了",
  4. Fail = "抱歉,失败了",
  5. }

image.png

相比数字枚举,字符串枚举仅成员名称被作为key,所以不支持反向映射

异构枚举

数字枚举和字符串枚举混用

  1. // 异构枚举
  2. enum Answer {
  3. N,
  4. Y = "Yes",
  5. }

image.png

并不推荐,容易引起混淆

枚举成员

枚举成员的值为只读类型

  1. const 常量枚举
    1. 没有初始值
    2. 对已有枚举成员的引用
    3. 常量的表达式

常量枚举成员会在编译时计算出结果,然后以常量的形式出现在运行时环境

  1. computed 需要被计算的枚举成员,非常量表达式。这些枚举变量的值不会在编译阶段被计算,而是被保留到程序执行阶段 ```typescript // 枚举成员 enum Role { Reporter = 1, Developer, Maintainer, Owner, Guest, } Role.Reporter = 2;

enum Char { // const a, // 没有初始值 b = Char.a, // 对已有枚举成员的引用 c = 1 + 3, // 常量的表达式

  1. // computed
  2. d = Math.random(), // 需要被计算的枚举成员
  3. e = "123".length, // 需要被计算的枚举成员
  4. f = 4,

}

  1. 尝试对枚举值进行修改会报错<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1544252/1594904515257-f78a9ca3-279b-4c7a-bca5-f6c24550872c.png#align=left&display=inline&height=319&margin=%5Bobject%20Object%5D&name=image.png&originHeight=319&originWidth=577&size=22067&status=done&style=shadow&width=577)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1544252/1594904828588-8edb3714-8561-47d9-8746-0a0171b88fe3.png#align=left&display=inline&height=395&margin=%5Bobject%20Object%5D&name=image.png&originHeight=395&originWidth=1276&size=48826&status=done&style=shadow&width=1276)
  2. > 常量枚举成员的值在编译时就会被计算出结果
  3. > 需要被计算的枚举成员值被保留了,在运行时环境才会被计算
  4. > <br />
  5. > 注:
  6. > computed后面出现的枚举成员必须赋初始值,否则会提示错误
  7. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1544252/1594904939403-7692a858-b8ff-42cb-bdc2-0d7603811173.png#align=left&display=inline&height=218&margin=%5Bobject%20Object%5D&name=image.png&originHeight=218&originWidth=384&size=12635&status=done&style=shadow&width=384)
  8. <a name="iKEr2"></a>
  9. ### 常量枚举
  10. > const声明的枚举就是常量枚举
  11. ```typescript
  12. // 常量枚举
  13. const enum Month {
  14. Jan,
  15. Feb,
  16. Mar,
  17. }
  18. let month = [Month.Jan, Month.Feb, Month.Mar];

常量枚举的作用: 当不需要一个对象,而只需要对象的值时,就可以使用常量枚举,这样能够减少在编译环境的代码

image.png

枚举被直接替换成了常量,这样在运行时的代码就会变得非常的简洁

image.png

枚举类型

枚举和枚举成员都可以作为一种单独的类型

  1. // 枚举类型
  2. // 枚举成员没有任何初始值
  3. enum E {
  4. a,
  5. b,
  6. }
  7. // 所有枚举成员都是数字枚举
  8. enum F {
  9. a = 0,
  10. b = 1,
  11. }
  12. // 所有枚举成员都是字符串枚举
  13. enum G {
  14. a = "apple",
  15. b = "banana",
  16. }
  17. let e: E = 3;
  18. let f: F = 3;
  19. // e === f
  20. // 枚举成员类型不同,不能比较
  21. let e1: E.a = 1;
  22. let e2: E.b;
  23. // e1 === e2
  24. // 相同类型的枚举成员,就可以进行比较
  25. let e3: E.a = 1;
  26. e1 === e3; // true
  27. // 字符串枚举的取值只能是枚举成员的类型
  28. let g1: G = G.b; // G枚举类型可以赋值为G.b
  29. let g2: G.a = G.a; // G.a枚举类型只能被赋值为自身G.a

可将任意number类型赋值给枚举类型,取值也可以超出枚举成员定义 两种不同类型的枚举,是不可以进行比较的,报错信息如下

image.png

学习笔记出自于梁宵老师课程