首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 1 章 准备知识
1.1 前端技术简介
1.2 HTML入门
1.2.1 准备开发工具
1.2.2 HTML中的基础标签
1.3 CSS入门
1.3.1 CSS选择器入门
1.3.2 CSS样式入门
1.4 JavaScript入门
1.4.1 我们为什么需要JavaScript
1.4.2 JavaScript语法简介
1.4.3 从JavaScript到TypeScript
1.5 渐进式开发框架Vue
1.5.1 第一个Vue应用
1.5.2 范例:一个简单的用户登录页面
1.5.3 Vue 3的新特性
1.5.4 我们为什么要使用Vue框架
第 2 章 TypeScript基础
2.1 重新认识TypeScript
2.1.1 安装TypeScript
2.1.2 TypeScript语言版本的HelloWorld程序
2.1.3 使用高级IDE工具
2.2 TypeScript中的基本类型
2.2.1 布尔、数值与字符串
2.2.2 特殊的空值类型
2.2.3 数组与元组
2.3 TypeScript中有关类型的高级内容
2.3.1 枚举类型
2.3.2 枚举的编译原理
2.3.3 any、never与object类型
2.3.4 关于类型断言
2.4 函数的声明和定义
2.4.1 函数的类型
2.4.2 可选参数、默认参数和不定个数参数
2.4.3 函数的重载
第 3 章 TypeScript中的面向对象编程
3.1 理解与应用“类”
3.1.1 类的定义与继承
3.1.2 类的访问权限控制
3.1.3 只读属性与存取器
3.1.4 关于静态属性与抽象类
3.1.5 类的实现原理
3.2 接口的应用
3.2.1 接口的定义
3.2.2 使用接口约定函数和可索引类型
3.2.3 使用接口来约束类
3.2.4 接口的继承
3.3 TypeScript中的类型推断与高级类型
3.3.1 关于类型推断
3.3.2 联合类型与交叉类型
3.3.3 TypeScript的类型区分能力
3.3.4 字面量类型与类型别名
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(一)
小册名称:TypeScript和Vue从入门到精通(一)
### 2.3.2 枚举的编译原理 在TypeScript中,枚举(Enumerations)是一种强大的类型系统特性,它允许开发者定义一组命名的常量。枚举类型提供了一种方式来组织这些常量,并使其易于理解和维护。了解枚举的编译原理,不仅能帮助我们更有效地使用枚举,还能深化对TypeScript类型系统和JavaScript运行时之间关系的理解。 #### 枚举的基本概念 首先,让我们回顾一下TypeScript中枚举的基本定义方式。枚举可以通过关键字`enum`来声明,其后跟枚举的名称和一组由逗号分隔的枚举成员(成员之间可以显式地指定值,也可以由TypeScript自动递增赋值)。 ```typescript enum Color { Red, Green, Blue } // 或者指定初始值和后续值 enum Direction { Up = 1, Down, // 自动赋值为2 Left, // 自动赋值为3 Right // 自动赋值为4 } ``` #### 枚举的编译输出 在TypeScript被编译成JavaScript时,枚举会被转换成JavaScript中可用的形式。根据枚举的定义和使用方式,编译后的输出会有所不同。主要存在两种形式的枚举编译:**数字枚举**和**字符串枚举**,以及一种混合形式,即**异构枚举**(虽然实际应用中较为少见)。 ##### 数字枚举的编译 对于数字枚举,TypeScript编译器会生成一个对象,该对象包含每个枚举成员的名称作为键,以及相应的数字值作为值。同时,编译器还会为枚举成员生成反向映射(如果`--target`编译选项设置为ES5或更高,且未使用`const enum`或`--isolatedModules`),这使得你可以通过枚举值反向查找到枚举成员的名称(在运行时)。 ```typescript enum Color { Red, Green, Blue } // 编译后(简化) var Color; (function (Color) { Color[Color["Red"] = 0] = "Red"; Color[Color["Green"] = 1] = "Green"; Color[Color["Blue"] = 2] = "Blue"; })(Color || (Color = {})); ``` 注意,这里的编译输出是一个自执行的函数,用于创建和初始化`Color`对象。每个枚举成员都被赋予了一个数字值,并且通过反向映射,这些值也被映射回枚举成员的名称上。 ##### 字符串枚举的编译 字符串枚举的编译与数字枚举类似,但枚举成员的值直接是字符串字面量。 ```typescript enum Day { Monday = "MON", Tuesday = "TUE", Wednesday = "WED" } // 编译后(简化) var Day; (function (Day) { Day["Monday"] = "MON"; Day["Tuesday"] = "TUE"; Day["Wednesday"] = "WED"; })(Day || (Day = {})); // 反向映射不存在,因为字符串枚举成员的值是唯一的 ``` 对于字符串枚举,由于每个成员的值都是唯一的字符串,所以不需要像数字枚举那样进行反向映射。 ##### 异构枚举的编译 异构枚举是那些同时包含数字和字符串成员的枚举。然而,由于这种枚举类型在运行时处理上较为复杂且不够直观,其应用场景较为有限。在编译时,TypeScript会尽量保持枚举成员的值不变,但并不会生成反向映射(因为混合类型的枚举成员之间无法建立稳定的反向关系)。 #### 枚举的高级用法与编译 除了基本的枚举定义和编译,TypeScript还提供了对枚举的一些高级操作,这些操作在编译时会产生不同的结果。 ##### 常量枚举 使用`const enum`声明的枚举会在编译时直接被替换为其值,而不是生成对象。这对于性能敏感的场景非常有用,因为它可以避免在运行时进行额外的对象查找。 ```typescript const enum Colors { Red, Green, Blue } let c = Colors.Red; // 编译后直接替换为 0 ``` ##### 枚举成员的计算和混合类型 枚举成员的值可以是计算得出的,但需要注意的是,如果第一个枚举成员是计算得出的,则后续成员必须也是计算得出的,因为TypeScript无法为它们生成默认的数字值。 ```typescript enum FileAccess { None, Read = 1 << 1, Write = 1 << 2, ReadWrite = Read | Write, // G is computed using constant enumerations G = "123".length } // 注意:上面的G成员会报错,因为FileAccess的第一个成员是None(默认类型), // 而后续成员试图进行计算赋值,这不符合规则。 ``` #### 结论 枚举是TypeScript中一个非常有用的特性,它允许开发者以类型安全的方式定义一组常量。了解枚举的编译原理,不仅能帮助我们更好地理解和使用枚举,还能在需要优化性能时,通过合理使用`const enum`等特性来提升代码的运行效率。在实际开发中,合理设计枚举类型,可以极大地提高代码的可读性和可维护性。同时,我们也需要注意枚举的局限性和最佳实践,比如避免在需要高度性能优化的场景下过度使用计算枚举成员,以及在设计API时考虑到枚举成员的扩展性和可维护性。
上一篇:
2.3.1 枚举类型
下一篇:
2.3.3 any、never与object类型
该分类下的相关小册推荐:
Vue面试指南
TypeScript和Vue从入门到精通(三)
Vue.js从入门到精通(二)
Vue.js从入门到精通(四)
移动端开发指南
vue项目构建基础入门与实战
Vue.js从入门到精通(三)
Vue原理与源码解析
vuejs组件实例与底层原理精讲
TypeScript和Vue从入门到精通(五)
VUE组件基础与实战
Vue3技术解密