Catalog
  1. 1. 枚举的优势
  2. 2. 使用枚举
    1. 2.1. 声名
    2. 2.2. 访问
  3. 3. 枚举分类
    1. 3.1. 数字枚举
    2. 3.2. 字符串枚举
    3. 3.3. 异构枚举
  4. 4. 枚举成员分类
    1. 4.1. 常量成员
    2. 4.2. 计算出来的成员
  5. 5. 字面量枚举成员
    1. 5.1. 指的是哪些成员
    2. 5.2. 有什么特殊的地方
  6. 6. 反向映射
Typescript 枚举

枚举的优势

定义一些带名字的常量,可以清晰的表达意图创建一组有区别的用例

使用枚举

声名

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

访问

  1. 通过枚举的属性来访问枚举成员
    Direction.Up
  2. 通过枚举的名字来访问枚举类型
    let obj:Direction

枚举分类

数字枚举

  • 如果初始化为1,其余成员会从1开始自动增长
  • 不适用初始化器,默认为从0开始
  • 每个枚举成员的值都是不同的

字符串枚举

  • 没有自增长的行为
  • 每个成员都必须用字符串字面量,或者另外一个字符串枚举成员进行初始化
  • 可读性好,能表达有用的信息

异构枚举

  • 同一个枚举中有多种类型的值
  • 除非你真的想要利用JavaScript运行时的行为,否则不建议这么做

枚举成员分类

常量成员

  1. 它是枚举的第一个成员且没有初始化器,这种情况下它被赋予值 0
  2. 不带有初始化器它之前的枚举成员是一个数字常量。 这种情况下,当前枚举成员的值为它上一个枚举成员的值加1。
  3. 枚举成员使用常量枚举表达式初始化
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    enum Cited {
    quoteMe
    }

    enum ConstEnum {
    // 一个枚举表达式字面量(主要是字符串字面量或数字字面量)
    FIRST = 1,
    // 一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
    SECOND = Cited.quoteMe,
    // 带括号的常量枚举表达式
    THIRD = (3),
    // 一元运算符 +, -, ~其中之一应用在了常量枚举表达式
    FOURTH = +4,
    // 常量枚举表达式做为二元运算符 +, -, *, /, %, <<, >>, >>>, &, |, ^的操作对象。
    // 若常数枚举表达式求值后为 NaN或 Infinity,则会在编译阶段报错。
    FIFTH = 5 / 1
    }

计算出来的成员

除了上一章节出现的情况,其他的枚举成员被当作是需要计算得出的值

1
2
3
4
5
6
7
function computed() {
return 1;
}
enum UnConstEnum {
FIRST = computed(),
SECOND = parseInt('12.3')
}

字面量枚举成员

指的是哪些成员

  1. 不带有初始值的常量枚举成员
  2. 被初始化为
    • 任何字符串
    • 任何数字
    • 应用了医院符号-的数字字面量

有什么特殊的地方

所有枚举成员都拥有字面量枚举值时

  1. 枚举成员成为了类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    enum ShapeKind {
    Circle,
    Square,
    }

    interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
    }

    interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
    }

    let c: Circle = {
    kind: ShapeKind.Square,
    // ~~~~~~~~~~~~~~~~ Error!
    radius: 100,
    }
  2. 枚举类型本身变成了每个枚举成员的联合

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    enum E {
    Foo,
    Bar,
    }

    function f(x: E) {
    if (x !== E.Foo || x !== E.Bar) {
    // ~~~~~~~~~~~
    // Error! Operator '!==' cannot be applied to types 'E.Foo' and 'E.Bar'.
    }
    }

反向映射

  • 枚举名->枚举值

  • 枚举值->枚举名

    1
    2
    3
    4
    enum Enum {
    A
    }
    let a = Enum.A;
Author: Helen
Link: http://be-awake.github.io/2019/10/17/typescript/typescript-enum/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment