《TypeScript实战指南》—2.1.5 枚举
2.1.5 枚举
我们常常会有这样的场景。比如与后端开发约定订单的状态开始是 0,未结账是 1,运输中是 2,运输完成是 3,已收货是 4。这样的纯数字会使得代码缺乏可读性。枚举就用于这样的场景。枚举可以让我们定义一些名字有意义的常量。使用枚举可以清晰地表达我们的意图。TypeScript支持基于数字枚举和字符串的枚举,下面分别介绍。
1.数字枚举
首先我们举例来看数字枚举:
enum OrderStatus{
Start= 1,
Unpaid,
Shipping,
Shipped,
Complete,
}
就像上面这样,我们通过数字来表达了订单状态。在实际的代码编写时,我们就直接使用 OrderStatus.Start 来代替原本的数字 1,这就使得代码具备了相当的可读性,甚至可以免去冗余的注释。
在上面的代码中还使用了一个小技巧,当只写 Start=1 时,后面的枚举变量就是递增的。但你也可以明确地写出每个枚举变量的数字,这取决于具体的业务场景。
如果我们连第一个枚举的变量的值都不写,会怎么样呢?就像下面这样:
enum OrderStatus{
Start,
Unpaid,
Shipping,
Shipped,
Complete,
}
现在,Start的值就是0 了,后面的枚举类型再依次递增。
通常情况下,在使用这样的写法时,我们其实是不在乎成员变量的具体值的,我们只知道这些值是不同的。
当然枚举类型中的值必须是确定的,比如,像下面这样的写法是不允许的:
enum Example {
A = hello(),
B, // error! 'A' is not constant-initialized, so 'B' needs an initializer
}
类似这样没有给出确定值的写法,在 TypeScript 中都是不允许的。
2.字符串枚举
字符串枚举的概念与数字枚举有一些细微的差别。
在一个字符串枚举中,所有成员必须都是字符串字面量,如下所示:
enum OrderStatus{
Start='Start',
Unpaid='Unpaid',
Shipping='Shipping',
Shipped='Shipped',
Complete='Complete',
}
由于字符串枚举没有递增的含义,字符串枚举成员都必须手动初始化。虽然显得烦琐,但相比在运行时环境下不能表达有用信息的数字枚举,字符串枚举能进一步提升可读性,且在运行时中提供具有刻度性质的值,这使得调试变得更容易。所以在实际的开发中,大家更喜欢使用字符串枚举。
3.反向映射
反向影射是数字枚举的一个技巧,这得益于 TypeScript 在实现数字枚举时的代码编译。
比如当我们设定了如下一个枚举时:
enum Enum {
A
}
编译器拿到这段代码会编译到 JavaScript,是如下这样的:
(function (Enum) {
Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
所以我们既可以从属性名获取值,也可以从值获取属性名:
const = Enum.A; // 0
constnameOfA = Enum[a]; // "A"
当然,这个特性是因为编译成 JavaScript 后是这样,所以在运行时包含了正向映射(key-> value)和反向映射(value -> key)。而字符串枚举编译后并没有这样的特性。
所以要注意,在字符串枚举中没有反向映射。
- 点赞
- 收藏
- 关注作者
评论(0)