typescript - 枚举
枚举类型是为数不多的TypeScript特性有的特性之一:
- 枚举其实就是将一组可能出现的值,一个个列举出来,定义在一个类型中,使他们成为一个整体,这个类型就是枚举类型
- 枚举允许开发者定义一组命名常量,常量可以是数字、字符串类型
// 枚举使用enum 关键字进行定义
// 枚举的首字母 一般约定俗称 是大写的
enum Direction {
// 枚举中的值一般是常量值 所以枚举中的变量名称一般全部大写
UP,
LEFT,
RIGHT,
DOWN
}
枚举类型和TS中其余特性不同的是:
- 枚举类型值在编译后,会存在一个新的对象留在编译后的代码中
- 而其余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
}