定义
枚举(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;