TypeScript+Vue.js前端开发从入门到精通
上QQ阅读APP看书,第一时间看更新

2.3.1 枚举类型

枚举类型是TypeScript对JavaScript标准数据类型的一个补充。当值域限定在一定范围内时,或者说当值域从有限个选项中进行选择时,使用枚举是非常合适的。例如某个操作的结果只有成功和失败两种,即可使用枚举来定义此操作结果的数据类型。又比如每周只有7天,每年只有12个月,在这类场景下,我们都可以使用枚举类型。

在TypeScript中,使用enum关键字来定义枚举。示例如下:

【源码见附件代码/第2章/6.enum/6.enum.ts】

如上面的代码所示,我们定义了一个名为Result的新类型,此类型本身是枚举类型,其中定义了两个枚举值,Success表示成功,Fail表示失败。默认情况下,我们定义的枚举都是数字枚举,并且首个枚举的值为0,后续依次递增。TypeScript也支持自定义数字枚举的枚举值,也支持定义字符串枚举,后面会介绍。Result枚举的使用示例如下:

【源码见附件代码/第2章/6.enum/6.enum.ts】

     var res:Result = Result.Success;
     //将输出:0
     console.log(res);

我们也可以手动设置枚举的初始值,示例如下:

【源码见附件代码/第2章/6.enum/6.enum.ts】

此时Success的值为10,Fail的值自动递增至11。当然,我们也可以对所有值都进行设置,示例如下:

【源码见附件代码/第2章/6.enum/6.enum.ts】

在使用时枚举可以直接使用枚举名,这样的好处是使代码的可读性变得很强,以上面的Result为例,如果操作结果返回一个数值,可能会使调用方对数值的意义感到疑惑,如果返回Result枚举值,则意义就非常明了了。

下面我们来看字符串枚举,字符串枚举是指枚举值会对应一个具体的字符串数据,示例如下:

【代码片段2-6 源码见附件代码/第2章/6.enum/6.enum.ts】

字符串枚举不仅使代码的可读性增强了,也会使运行时的输出信息更加可读。

理论上讲,枚举项的值有两种定义方式,一种是采用常量来定义,另一种是采用计算量来定义。在以下场景中,枚举值是以常量的方式定义的。

(1)枚举的首个枚举项没有初始化,其会被默认赋值为0,并且其后的枚举项的值会依次递增。示例如下:

【源码见附件代码/第2章/6.enum/6.enum.ts】

(2)当前枚举项没有初始化,并且其前一个枚举项是一个数字常量,则此枚举项的值在上一个枚举项的基础上加1。示例如下:

【源码见附件代码/第2章/6.enum/6.enum.ts】

(3)当前枚举项进行了初始化,且初始化使用的是常量表达式,包括数字常量、字符串常量,其他常量定义枚举值,应用了+、−、~这类一元运算符的常量表达式以及应用了+、−、*、/、%、<<、>>、>>>、&、|、^的常量表达式。示例如下:

【源码见附件代码/第2章/6.enum/6.enum.ts】

对于常量定义的枚举,在TypeScript编译时,其会被编译成对应的常量值。除上述所列举的情况外,使用函数或表达式包含变量的枚举定义方式都被称为计算量定义方式。示例如下:

【源码见附件代码/第2章/6.enum/6.enum.ts】

上面代码枚举中的C枚举项就是计算量定义的,编译时其会直接被编译成计算表达式,而不是常量。需要注意,此处所涉及的常量枚举和计算量枚举只会影响编译的结果,对于枚举值本身来说,这只会影响枚举值是在编译时确定还是在运行时确定,但是枚举的值一旦确定,就不会随其表达式中包含的变量的更改而更改。以上面的Rank枚举为例,下面的代码两次输出的值不变。

【源码见附件代码/第2章/6.enum/6.enum.ts】

     //20
     console.log(Rank.C);
     mut = 30;
     //20
     console.log(Rank.C);