TypeScript中的枚举(typescript enum)
枚举(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
作者:莫笑沉吟
链接:https://juejin.cn/post/7032940254919131173