![TypeScript+Vue.js前端开发从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/200/52842200/b_52842200.jpg)
上QQ阅读APP看书,第一时间看更新
2.3.2 枚举的编译原理
![](https://epubservercos.yuewen.com/CABD60/31397740404941606/epubprivate/OEBPS/Images/Figure-P51_19816.jpg?sign=1738809330-hxGD5OaPBuwkLFGu83rpkg5MYLx6kTtW-0-711887537348e871e811dc819594c6c7)
JavaScript本身没有提供对枚举类型的支持,你是否思考过,TypeScript是使用什么数据结构来实现枚举的?我们先来看如下示例。
【源码见附件代码/第2章/6.enum/6.enum.ts】
![](https://epubservercos.yuewen.com/CABD60/31397740404941606/epubprivate/OEBPS/Images/Figure-P51_83033.jpg?sign=1738809330-U36wIrjahXCxzIJrRMH3gXNmQnAp46vN-0-50601ec97b2eb1a66e0d727f4167a2ef)
从输出信息可以看到,当我们把枚举当成一个对象来使用时,语法上完全没有问题,而且通过枚举名可以取到枚举值,通过枚举值也可以取到枚举名。其实被TypeScript编译后,枚举就是一个对象,我们也可以直接将枚举进行打印,示例如下:
//{10: 'Success', 20: 'Fail', Success: 10, Fail: 20} console.log(Result);
要了解TypeScript的编译原理,最直接的方式是查看编译后的JavaScript文件,以上面的Result枚举为例,编译后的结果如下:
![](https://epubservercos.yuewen.com/CABD60/31397740404941606/epubprivate/OEBPS/Images/Figure-P51_83034.jpg?sign=1738809330-ltFXMhIrWiDTYxAwJ8sS0xqrK6PpsJW3-0-78c18e008815cdb300da98a79dce9a5b)
可以看到,编译后的JavaScript代码实际上是定义了一个名为Result的变量,变量存储的数据是一个对象,对象中将枚举的值与枚举字符串格式的名字进行了映射,同时也反向进行了映射。如果我们定义的枚举本身就是字符串枚举,则编译的结果就更加简单了,例如:
![](https://epubservercos.yuewen.com/CABD60/31397740404941606/epubprivate/OEBPS/Images/Figure-P52_83036.jpg?sign=1738809330-wMaKR36HdvzPiogFiaINzTl9oGnMUDR9-0-c437c348652da13debdabfe9b4128ab8)
编译后的结果为:
![](https://epubservercos.yuewen.com/CABD60/31397740404941606/epubprivate/OEBPS/Images/Figure-P52_83037.jpg?sign=1738809330-IOT9laILyktjI2YcEBM0SYjiUctTVlum-0-c9bb11a090817bb814c835563699deb0)
现在,回忆一下我们之前讲的常量定义枚举值与计算量定义枚举值会影响编译后的结果,是不是就更容易理解了?例如下面的枚举:
![](https://epubservercos.yuewen.com/CABD60/31397740404941606/epubprivate/OEBPS/Images/Figure-P52_83038.jpg?sign=1738809330-91mHmJiczggTnXOLrQ83JWwZ6oH688PM-0-0b186db9bc0b485607a9a60cb076b29f)
编译后的结果如下:
![](https://epubservercos.yuewen.com/CABD60/31397740404941606/epubprivate/OEBPS/Images/Figure-P52_83039.jpg?sign=1738809330-TBwKOkKVHOdYVNv2UUW29gBtji24Bs3n-0-59d6e3cb05dc1a2143d25fbe8187e31d)