7 种枚举类型

数据枚举

  • 默认是从 0 开始递增的数字集合
  • 可指定任意类型(比如整数、负数、小数等)、任意起始的数字,其后未显示指定值的成员会递增加 1。

    1. enum Day {
    2. SUNDAY = 1,
    3. MONDAY,
    4. TUESDAY,
    5. WEDNESDAY,
    6. THURSDAY,
    7. FRIDAY,
    8. SATURDAY
    9. }

    字符串枚举

  • 定义值是字符串字面量的枚举称之为字符串枚举

    1. enum Direction {
    2. Up = 'Up',
    3. Down = 'Down',
    4. Left = 'Left',
    5. Right = 'Right'
    6. }

    异构枚举

  • 支持枚举类型同时拥有数字和字符类型的成员

    1. enum Day {
    2. SUNDAY = 'SUNDAY',
    3. MONDAY = 2,
    4. ...
    5. }

    常量成员、计算(值)成员

    常量成员

  1. 字符串、数字字面量,未指定初始值从 0 开始的数字常量;
  2. 引用来自预先定义的常量成员,比如来自当前枚举或其他枚举;
  3. 圆括号包含的常量枚举表达式;
  4. 在常量表达式上运用一元运算符+、-、~;
  5. 操作常量表达式中的二元运算符+、-、*、/、%、<<、>>、>>>、&、|、^;

计算(值)成员

除以上这些情况之外,其他都被认为是计算(值)成员。

枚举成员类型和联合枚举

枚举成员

  • 缺省值(从0开始递增)
  • 数字字面量
  • 字符串字面量

常量枚举

const 修饰符定义常量枚举,常量枚举定义转译为 JavaScript 之后会被移除,并在使用常量枚举成员的地方被替换为相应的内联值,因此常量枚举的成员都必须是常量成员(字面量 + 转译阶段可计算值的表达式)。

  1. const enum Day {
  2. SUNDAY,
  3. MONDAY
  4. }
  5. const work = (d: Day) => {
  6. switch (d) {
  7. case Day.SUNDAY:
  8. return 'take a rest';
  9. case Day.MONDAY:
  10. return 'work hard';
  11. }
  12. }
  13. }

外部枚举

通过 declare 描述一个在其他地方已经定义过的枚举类型,通过这种方法定义出来的枚举类型,被称为外部枚举。

  1. declare enum Day {
  2. SUNDAY,
  3. MONDAY,
  4. }
  5. const work = (x: Day) => {
  6. if (x === Day.SUNDAY) {
  7. x; // 类型是 Day
  8. }
  9. }

外部枚举和常量枚举的区别:

  • 在外部枚举中,没有被指定初始值的成员都会被当做计算(值)成员,这跟常量枚举恰好相反。
  • 即使外部枚举只包含字面量成员,这些成员的类型也不会是字面量成员类型,自然完全不具备字面量类型的各种特性。

枚举的本质

可以把枚举类型看成一个JavaScript对象,而由于其特殊的构造,导致其拥有正反向同时映射的特性。