Skip to main content

enum 枚举类型

一、枚举类型的定义

枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。

换句话说,枚举就是一个对象的所有可能取值的集合。

枚举的结构为:

enum 枚举名 {
标识符①[ = 整型常数],
标识符②[ = 整型常数],
...
标识符N[ = 整型常数],
}枚举变量;

二、枚举的用法

枚举通过 enum 关键字进行定义,形式如下:

enum xxx { ... }

声明关键字为枚举类型的方式如下:

// 声明 d 为枚举类型 Direction
let d: Direction;

三、枚举的类型

枚举根据类型可以分成:

  • 数字枚举
  • 字符串枚举
  • 异构枚举

1、数字枚举

声明一个枚举类型时,虽然没有给它们赋值,但它们的值是默认的数字类型,从 0 开始依次累加:

enum Direction {
Up, // 值默认为 0
Down, // 值默认为 1
Left, // 值默认为 2
Right // 值默认为 3
}

console.log(Direction.Up === 0); // true
console.log(Direction.Down === 1); // true
console.log(Direction.Left === 2); // true
console.log(Direction.Right === 3); // true

如果将第一个值进行赋值后,后面的值也会根据前一个值进行累加 1:

enum Direction {
Up = 10,
Down,
Left,
Right
}

console.log(Direction.Up, Direction.Down, Direction.Left, Direction.Right);
// 10 11 12 13

2、字符串枚举

枚举类型的值其实也可以是字符串类型:

enum Direction {
Up = 'Up',
Down = 'Down',
Left = 'Left',
Right = 'Right'
}

console.log(Direction['Right'], Direction.Up);
// Right Up

如果设定了一个变量为字符串之后,后续的字段也需要赋值字符串,否则会报错:

enum Direction {
Up = 'UP',
Down, // error TS1061: Enum member must have initializer
Left, // error TS1061: Enum member must have initializer
Right // error TS1061: Enum member must have initializer
}

3、异构枚举

异构枚举即将数字枚举和字符串枚举结合起来混合使用:

enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}

通常较少使用。

四、枚举的本质

举个例子:

enum Direction {
Up,
Down,
Left,
Right
}

通过编译后,JS 代码如下:

var Direction;
(function (Direction) {
Direction[Direction["Up"] = 0] = "Up";
Direction[Direction["Down"] = 1] = "Down";
Direction[Direction["Left"] = 2] = "Left";
Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));

上述代码可以看到, Direction[Direction["Up"] = 0] = "Up" 可以分成

  • Direction["Up"] = 0
  • Direction[0] = "Up"

所以定义枚举类型后,可以通过正反映射拿到对应的值,如下:

enum Direction {
Up,
Down,
Left,
Right
}

console.log(Direction.Up === 0); // true
console.log(Direction[0]); // Up

并且多处定义的枚举是可以进行合并操作,如下:

enum Direction {
Up = 'Up',
Down = 'Down',
Left = 'Left',
Right = 'Right'
}

enum Direction {
Center = 1
}

编译后,JS 代码如下:

var Direction;
(function (Direction) {
Direction["Up"] = "Up";
Direction["Down"] = "Down";
Direction["Left"] = "Left";
Direction["Right"] = "Right";
})(Direction || (Direction = {}));
(function (Direction) {
Direction[Direction["Center"] = 1] = "Center";
})(Direction || (Direction = {}));

可以看到,Direction 对象属性会叠加。

五、枚举的应用

当后端返回的字段使用 0 - 6 标记对应的日期时,就可以使用枚举可提高代码可读性,如下:

enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true

包括后端返回的 0、1 等状态都可以通过枚举去定义,以提高代码的可读性,方便维护。