TypeScript的新类型(六):枚举

8 阅读2分钟

定义

枚举(enum)可以定义⼀组命名常量,它能增强代码的可读性,也让代码更好维护。

  • 常用于定义 一组 连续且相关常量 ,如
  • 增强代码的可读性,使得语义性更强,也让代码更好维护。能避免日常编写中错误
enum Direction {
  Up,
  Down,
  Left,
  Right,
}
function move(data: Direction) {
  switch (data) {
    case Direction.Up:
      console.log(`向 【上】`);
      break;
    case Direction.Down:
      console.log(`向 【下】`);
      break;
    case Direction.Left:
      console.log(`向 【左】`);
      break;
    case Direction.Right:
      console.log(`向 【右】`);
      break;
    default:
      console.log(`向 【未知】`);
  }
}
move(Direction.Left); // 向 【左】
move(Direction.Down); // 向 【下】
move(Direction.Doewn); // 向 【未知】

enum实际是个对象

  • enum实际是个对象,里面存的是 常量与值键值对,和 反向映射 (只有数字枚举有)的键值对
  • 数字枚举字符串枚举常量枚举
// 数字枚举
enum Direction1 {
 Up,
 Down,
 Left,
 Right
}
console.log(Direction1) 
/* 打印Direction1会看到如下内容
{
  '0': 'Up', // 反向映射
  '1': 'Down', // 反向映射
  '2': 'Left', // 反向映射
  '3': 'Right', // 反向映射
  Up: 0,
  Down: 1,
  Left: 2,
  Right: 3
}
*/

数字枚举

  • 只有数字枚举反向映射,字符串枚举和常量枚举没有
  • 数字枚举对象的value值默认是按照顺序从下标0递增

自定义数字枚举中的值

  • 可以在enum中使用常量 = number自定义值,此时会按照最后面一个自定义的值开始递增
enum Direction2 {
 Up,
 Down = 12,
 Left,
 Right
}
console.log(Direction2) 
/* 打印Direction2会看到如下内容
{
  '0': 'Up',
  '12': 'Down',
  '13': 'Left',
  '14': 'Right',
  Up: 0,
  Down: 12,
  Left: 13,
  Right: 14
}
*/

字符串枚举

  • 没有反向映射
// 字符串枚举
enum Direction3 {
  Up = "To Up",
  Down = "To Down",
  Left = "To Left",
  Right = "To Right",
}
console.log(Direction3) 
/* 打印Direction3会看到如下内容
{ Up: 'To Up', Down: 'To Down', Left: 'To Left', Right: 'To Right' }
*/

常量枚举

常量枚举是⼀种特殊枚举类型,它使⽤const关键字定义,在编译时会被内联避免⽣成⼀些额外的代码

  • 没有反向映射
  • 使⽤ const 关键字定义

编译时内联

所谓“内联”其实就是TypeScript在编译时,会将枚举成员引⽤替换为它们的实际值,⽽不是⽣成额外的枚举对象。这可以减少⽣成的JavaScript代码量,并提⾼运⾏时性能。

const enum Directions {
 Up,
 Down,
 Left,
 Right
}
let x = Directions.Up;
// 编译成js的时候为下面的代码
var x = 0 /* Directions.Up */;

不使用const定义常量枚举编译成js文件

enum Directions {
 Up,
 Down,
 Left,
 Right
}
let x = Directions.Up;
// 编译成js的时候为下面的代码
var Directions;
(function (Directions) {
    Directions[Directions["Up"] = 0] = "Up";
    Directions[Directions["Down"] = 1] = "Down";
    Directions[Directions["Left"] = 2] = "Left";
    Directions[Directions["Right"] = 3] = "Right";
})(Directions || (Directions = {}));
var x = Directions.Up;