一个角色判断例子
function initByRole(role) { if (role === 1 || role === 2) { // do sth } else if (role === 3 || role === 4) { // do sth } else if (role === 5) { // do sth } else { // do sth } }
上面的代码存在的问题:
- 可读性差:很难记住数字的含义
- 可维护性差:代表角色的数字硬编码了,牵一发动全身
可以使用 ts 里的枚举类型来解决
枚举
枚举:一组有名字的常量集合。(可以理解成手机里的通讯录:姓名-手机号)
数字枚举
默认取值从 0 开始,后面的成员递增。
enum Role { Reporter, Developer, Maintainer, Owner, Guest } console.log(Role);
枚举的实现原理:反向映射:既可以使用 key 索引,也可以使用 value 索引
字符串枚举
字符串枚举不能进行反向映射
enum Message { Success = 'success', Fail = 'fail' } console.log(Message);
异构枚举
数字枚举与字符串枚举混用(不建议使用,容易引起混淆)
enum Status { OK = 200, Error = 'Error' } console.log(Status);
枚举成员
枚举成员的值只读。
Role.Reporter = 2; // 无法为“Reporter”赋值,因为它是只读属性。
枚举成员分类:
- 常量枚举成员:会在编译的过程中计算出结果,以常量的形式出现在运行时环境
- 没有初始值
- 对已有枚举的引用
- 一些常量表达式
- 计算枚举成员:非常量的表达式,其值会在运行时环境计算
- 注意: 计算枚举成员后的枚举成员要赋予初始值
enum Char { // const a, b = Char.a, c = 1 + 3, // computed d = Math.random(), e = '123'.length, f = 4 }
常量枚举
用 const 声明的枚举就是一个常量枚举。
特性:会在编译阶段被移除。编译后没有任何代码。
作用:当我们不需要一个对象,但需要对象值的时候,可以使用常量枚举。可以减少编译环境的代码。
const enum Month { Jan, Feb, Mar } let month = [Month.Jan, Month.Feb, Month.Mar]
枚举类型
enum E { a, b } enum F { a = 0, b = 1 } enum G { a = "apple", b = "banana" } let e: E = 1; let f: F = 1; // 此比较似乎是无意的,因为类型“E”和“F”没有重叠。 // e === f let e1: E.a; let e2: E.b; let e3: E.a; let g1: G = G.b; let g2: G.a = G.a;