这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天从周一到周日,三原色红绿蓝,四个方位上下左右等。
用途:
使用枚举我们可以定义一些有名字的数字常量。 枚举通过enum关键字来定义。
数字枚举
示例:
enum Direction{
Up,
Down,
Left,
Right,
}
console.log(Direction.Up);
使用ts-node命令调用我们的程序
运行结果:
在这里枚举成员会被赋值为从
0开始递增的数字。这个例子中UP就是0,Down是1,到Right为3
同时也会对枚举值到枚举名进行反向映射:
示例:
enum Direction{
Up,
Down,
Left,
Right,
}
console.log(Direction[0]);
运行结果:
实现反向映射的原理:
首先我们查看编译后的JavaScript代码:
var Direction;
(function (Direction) {
Direction[Direction["Up"] = 0] = "Up";
Direction[Direction["Down"] = 1] = "Down";
Direction[Direction["Left"] = 2] = "Left";
Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));
console.log(Direction.Down);
console.log(Direction[0]);
首先他声明了一个作用域Direction,
然后Direction["Up"] = 0会将Direction里的Up赋值为0因为JavaScript中赋值运算符返回的值是被赋予的这个值所以Direction["Up"] = 0返回0,因此 Direction[Direction["Up"] = 0] = "Up";就应该看作Direction[0] = "Up";这样就实现了一个双向赋值的过程。
手动赋值
我们也可以给枚举项手动赋值:
enum Direction{
Up=10,
Down,
Left,
Right,
}
console.log(Direction.Up);
上面的例子中,未手动赋值的枚举项会接着上一个枚举项递增。
运行结果:
字符串枚举
示例:
enum Direction{
Up = 'Up',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
用途我们可以做一个简单的字符串比较:
enum Direction{
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
const value = 'UP'
if(value === Direction.Up){
console.log('go up!');
}
运行结果:
常量枚举(常数枚举)
常数枚举是使用 const enum 定义的枚举类型:
const enum Direction{
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
const value = 'UP'
if(value === Direction.Up){
console.log('go up!');
}
常量枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员。
编译后代码:
var value = 'UP';
if (value === "UP" /* Up */) {
console.log('go up!');
}
注意:只有常量值可以使用常量枚举,如果包含了计算值会报错
示例:
const enum Direction{
Up ,
Down,
Left,
Right = 'RIGHT'.length,
}
报错信息:
拓展
我们在数字枚举中使用ts-node命令掉用程序需要先安装ts-node, 安装它的原因是typescript自带的tsc命令并不能直接运行typescript代码。但值得注意的是 ts-node 并不等于 typescript 的 Node.js ,仅仅封装了 typescript 的编译过程,提供直接运行typescript代码的能力。
全局安装命令:
npm install -g ts-node