TypeScript: 枚举
:::warning
枚举是 TypeScript 的少数功能之一,它不是 JavaScript 的类型级扩展。
它允许开发人员定义一组命名常量。
使用枚举可以更轻松地记录意图,或创建一组不同的案例
:::
:::info
TypeScript 提供基于数字和基于字符串的枚举。
:::
数字枚举实例
enum Direction {
Up,
Down,
Left,
Right
}
console.log(Direction.Up) // 0
enum Direction {
Up = 1, // 我们可以初始化,后面的值都会递增
Down,
Left,
Right
}
console.log(Direction.Right) // 4
// 使用枚举的名称作为类型
enum UserResponse {
No = 0,
Yes = 1,
}
function respond(recipient: string, message: UserResponse): void {
}
respond('hello', UserResponse.Yes);
反向映射
enum Direction {
Up,
Down,
Left,
Right
}
console.log(Direction.Up) // 0
// 它做了一个反向映射,我们可以通过数组的形式去获取
console.log(Direction[0]) // up
反向映射的源码分析
var Direction;
(function (Direction) {
// Direction["Up"] = 0 js中赋值运算值返回的值就是被赋予的值
// 也就是 Direction["Up"] = 0 就是 0
// 所以就实现了双向赋值的过程
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.Up); // 0
console.log(Direction[0]); // up
字符串枚举
:::warning 在字符串枚举中,每个成员都必须使用字符串文字或另一个字符串枚举成员进行常量初始化。 :::
和数字枚举的区别在于: 1、字符串枚举没有自动递增的行为 2、字符串枚举的好处就是可以提供有意义并可读的值。
示例
// 每个成员都必须使用字符串文字
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
const value = 'UP'
if(value === Direction.Up){
console.log('go up!')
}
"use strict";
exports.__esModule = true;
// 每个成员都必须使用字符串文字
var Direction;
(function (Direction) {
Direction["Up"] = "UP";
Direction["Down"] = "DOWN";
Direction["Left"] = "LEFT";
Direction["Right"] = "RIGHT";
})(Direction || (Direction = {}));
var value = 'UP';
if (value === Direction.Up) {
console.log('go up!');
}
常量枚举
:::warning
就是在枚举前面增加一个const, 大大提升性能。
:::
:::warning
但并不是所有的enum都可以使用这种写法,
枚举的值有两种类型: 计算成员和常量成员。
只有常量成员才能使用常量枚举。
:::
// 每个成员都必须使用字符串文字
const enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
const value = 'UP'
if(value === Direction.Up){
console.log('go up!')
}
// if(value === Direction.Up) // Direction.Up = 'Up'
// 当我们调用 Direction.Up时,他会直接翻译成结果 UP
var value = 'UP';
// 他会内联枚举的任何用法,并且不会把枚举里面的东西变成js代码。
// 所以
// 这个js文件没有Direction对象
if (value === "UP" /* Up */) {
console.log('go up!');
}
注意事项
:::danger 我们上述的所有例子都是常量成员值,计算成员后面会讲。 :::