06 # 枚举类型

简介: 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;



目录
相关文章
|
7月前
|
C#
C#数据类型之枚举类型
C#数据类型之枚举类型
178 0
|
7月前
|
安全 C++
C++程序中的枚举类型
C++程序中的枚举类型
68 1
|
7月前
|
Java C语言 C++
使用枚举类型
使用枚举类型
45 0
|
7月前
|
存储 编译器 C++
23枚举类型
23枚举类型
32 0
|
7月前
|
编译器 Linux C++
C++ “美中不足” --->强枚举类型
C++ “美中不足” --->强枚举类型
|
编译器
枚举类型详解
枚举类型详解
135 0
枚举类型详解
|
JavaScript C#
enum:枚举类型
enum:枚举类型
189 0