《TypeScript实战指南》—2.1.5 枚举

举报
华章计算机 发表于 2019/06/16 11:24:44 2019/06/16
【摘要】 本节书摘来自华章计算机《TypeScript实战指南》一书中的第2章,第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)。而字符串枚举编译后并没有这样的特性。

所以要注意,在字符串枚举中没有反向映射。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。