枚举(enum)可以定义一组命名常亮,增强代码的可读性,也可以让代码更好的维护。
在刚开始先来一段代码来感受一下:
function walk(str: string) {
if (str === 'up') {
console.log('向【上】⾛')
} else if (str === 'down') {
console.log('向【下】⾛')
} else if (str === 'left') {
console.log('向【左】⾛')
} else if (str === 'right') {
console.log('向【右】⾛')
} else {
console.log('未知⽅向')
}
}
walk('up')
walk('down')
walk('left')
walk('right')
数字枚举
数字枚举是一种最常见的枚举类型,其成员的值会自动递增,并且数字枚举还具备反向映射的特点。
看以下代码:
enum Direction {
Up,
Down,
Left,
Right
}
console.log(Direction) // 打印Direction会看到如下内容
/*
{
0:'Up',
1:'Down',
2:'Left',
3:'Right',
Up:0,
Down:1,
Left:2,
Right:3
}
*/
// 反向映射
console.log(Direction.Up)
console.log(Direction[0])
// 此⾏代码报错,枚举中的属性是只读的
Direction.Up = 'shang'
经过改良后的代码可以写成这样:
enum Direction {
Up,
Down,
Left,
Right
}
function walk(n: Direction) {
if (n === Direction.Up) {
console.log('向【上】⾛')
} else if (n === Direction.Down) {
console.log('向【下】⾛')
} else if (n === Direction.Left) {
console.log('向【左】⾛')
} else if (n === Direction.Right) {
console.log('向【右】⾛')
} else {
console.log('未知⽅向')
}
}
walk(Direction.Up)
walk(Direction.Down)
字符串枚举
顾名思义,枚举成员的值是字符串
enum Direction {
Up = 'up',
Down = 'down',
Left = 'left',
Right = 'right'
}
let dir: Direction = Direction.Up
console.log(dir) // 输出: "up"
常亮枚举
官方描述:常亮枚举是一种特殊枚举类型,它使用 const 关键字进行定义,在编译的时候避免生成一些额外的代码。
接下来看一个对比:
这是不适用常亮枚举的:
enum Directions {
Up,
Down,
Left,
Right
}
let x = Directions.Up
编译后的是这样的:
'use strict'
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 = {}))
let x = Directions.Up
这是只用常亮枚举的:
const enum Directions {
Up,
Down,
Left,
Right
}
let x = Directions.Up
编译后的:
"use strict";
let x = 0 /* Directions.Up */;