typescript - 枚举

86 阅读2分钟

typescript - 枚举

枚举类型是为数不多的TypeScript特性有的特性之一:

  • 枚举其实就是将一组可能出现的值,一个个列举出来,定义在一个类型中,使他们成为一个整体,这个类型就是枚举类型
  • 枚举允许开发者定义一组命名常量,常量可以是数字、字符串类型
// 枚举使用enum 关键字进行定义
// 枚举的首字母 一般约定俗称 是大写的
enum Direction {
  // 枚举中的值一般是常量值 所以枚举中的变量名称一般全部大写
  UP,
  LEFT,
  RIGHT,
  DOWN
}

枚举类型和TS中其余特性不同的是:

  1. 枚举类型值在编译后,会存在一个新的对象留在编译后的代码中
  2. 而其余TS特性(如类型注解),仅仅只是在编译时期起作用,在编译后的代码中,会被移除

所以上述代码在进行编译后会形成如下对象

"use strict";

var Direction;
(function (Direction) {
  Direction[(Direction["UP"] = 0)] = "UP";
  Direction[(Direction["LEFT"] = 1)] = "LEFT";
  Direction[(Direction["RIGHT"] = 2)] = "RIGHT";
  Direction[(Direction["DOWN"] = 3)] = "DOWN";
})(Direction || (Direction = {}));

所以这也就意味着我们即可以通过索引值去获取对应的值,也可以通过常量名去获取对应的值

// 枚举在经过编译后,本质上形成的是一个对象
enum Direction {
  UP,
  LEFT,
  RIGHT,
  DOWN
}

console.log(Direction.UP) // => 0
console.log(Direction[0]) // => 'UP'

常数枚举

如果我们并不希望,编译后的枚举影响编译后的js代码,此时我们就可以使用常数枚举

const enum Direction {
  UP,
  LEFT,
  RIGHT,
  DOWN
}

console.log(Direction.UP) // => 0

编译后为

console.log(0 /* Direction.UP */); // => 0

枚举值

默认枚举值是从0开始依次递增的

const enum Direction {
  UP, // => 0
  LEFT, // => 1
  RIGHT, // => 2
  DOWN // => 3
}

如果设置了数值作为枚举值,那么会从设置的数字值开始依次递增

const enum Direction {
  UP, // 0
  LEFT = 100, // 100
  RIGHT, // 101
  DOWN // 102
}

如果设置的值是字符串,那么ts就无法主动进行递增操作,所以从设置为字符串的枚举值开始

之后的每一个枚举都需要手动进行赋值操作

const enum Direction {
  UP, // 0
  LEFT, // 1
  RIGHT = 'right', // 'right'
  DOWN = 'down' // down
}