06 # 枚举类型

一个角色判断例子

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;

猜你喜欢

转载自blog.csdn.net/kaimo313/article/details/134701772
06