TypeScript 中枚举类型的理解?应用场景有哪些

ops/2024/10/10 15:10:42/

文章目录

    • 一、是什么
    • 二、使用
      • 数字枚举
      • 字符串枚举
      • 异构枚举
      • 本质
    • 三、应用场景

一、是什么

枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型

通俗来说,枚举就是一个对象的所有可能取值的集合

在日常生活中也很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就可以看成是一个枚举

枚举的说明与结构和联合相似,其形式为:

enum 枚举名{标识符①[=整型常数],标识符②[=整型常数],...标识符N[=整型常数],
}枚举变量;

二、使用

枚举的使用是通过enum关键字进行定义,形式如下:

enum xxx { ... }

声明关键字为枚举类型的方式如下:

// 声明d为枚举类型Direction
let d: Direction;

类型可以分成:

  • 数字枚举

  • 字符串枚举

  • 异构枚举

数字枚举

当我们声明一个枚举类型是,虽然没有给它们赋值,但是它们的值其实是默认的数字类型,而且默认从0开始依次累加:

enum Direction {Up,   // 值默认为 0Down, // 值默认为 1Left, // 值默认为 2Right // 值默认为 3
}console.log(Direction.Up === 0); // true
console.log(Direction.Down === 1); // true
console.log(Direction.Left === 2); // true
console.log(Direction.Right === 3); // true

如果我们将第一个值进行赋值后,后面的值也会根据前一个值进行累加1:

enum Direction {Up = 10,Down,Left,Right
}console.log(Direction.Up, Direction.Down, Direction.Left, Direction.Right); // 10 11 12 13

字符串枚举

枚举类型的值其实也可以是字符串类型:enum Direction {Up = 'Up',Down = 'Down',Left = 'Left',Right = 'Right'
}console.log(Direction['Right'], Direction.Up); // Right Up

如果设定了一个变量为字符串之后,后续的字段也需要赋值字符串,否则报错:

enum Direction {Up = 'UP',Down, // error TS1061: Enum member must have initializerLeft, // error TS1061: Enum member must have initializerRight // error TS1061: Enum member must have initializer
}

异构枚举

即将数字枚举和字符串枚举结合起来混合起来使用,如下:

enum BooleanLikeHeterogeneousEnum {No = 0,Yes = "YES",
}

通常情况下我们很少会使用异构枚举

本质

现在一个枚举的案例如下:

enum Direction {Up,Down,Left,Right
}

通过编译后,javascript如下:

var Direction;
(function (Direction) {Direction[Direction["Up"] = 0] = "Up";Direction[Direction["Down"] = 1] = "Down";Direction[Direction["Left"] = 2] = "Left";Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));

上述代码可以看到, Direction[Direction["Up"] = 0] = "Up"可以分成

  • Direction[“Up”] = 0
  • Direction[0] = “Up”

所以定义枚举类型后,可以通过正反映射拿到对应的值,如下:

enum Direction {Up,Down,Left,Right
}console.log(Direction.Up === 0); // true
console.log(Direction[0]); // Up

并且多处定义的枚举是可以进行合并操作,如下:

enum Direction {Up = 'Up',Down = 'Down',Left = 'Left',Right = 'Right'
}enum Direction {Center = 1
}

编译后,js代码如下:

var Direction;
(function (Direction) {Direction["Up"] = "Up";Direction["Down"] = "Down";Direction["Left"] = "Left";Direction["Right"] = "Right";
})(Direction || (Direction = {}));
(function (Direction) {Direction[Direction["Center"] = 1] = "Center";
})(Direction || (Direction = {}));

可以看到,Direction对象属性回叠加

三、应用场景

就拿回生活的例子,后端返回的字段使用 0 - 6 标记对应的日期,这时候就可以使用枚举可提高代码可读性,如下:

enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true

包括后端日常返回0、1 等等状态的时候,我们都可以通过枚举去定义,这样可以提高代码的可读性,便于后续的维护


http://www.ppmy.cn/ops/123551.html

相关文章

微信小程序15天

UniApp(Vue3组合式API)和微信小程序15天学习计划 第1天:开发环境配置和基础知识 UniApp和微信小程序概述及对比安装并配置HBuilderX(UniApp)和微信开发者工具创建第一个UniApp Vue3项目和微信小程序项目了解两个平台的项目结构差异配置外部浏览器和各种小程序模拟…

影视cms泛目录用什么程序?苹果cms二次开发泛目录插件

影视CMS泛目录一般使用的程序有很多种,(maccmscn)以下是其中几种常见的程序: WordPress:WordPress是一个非常流行的开源内容管理系统,可以通过安装一些插件来实现影视CMS泛目录功能。其中,一款常…

JDBC介绍

JDBC: ( Java DataBase Connectivity ),就是使用Java语言操作关系型数据库的一套API。 本质: Sun公司官方定义的一套操作所有关系型数据库的规范,即接口。 各个数据库厂商去实现这套接口,提供数据库驱动jar包。 我们…

python27_strip()去除函数

strip()去除函数 # 示例字符串 s1 "*hello*world*oh*yeah*" s2 " helloworldohyeah "# 使用 strip() 去除两端的 * def StrStrip(a):result_strip a.strip("*")return result_strip# 替换成空字符串 def StrReplaceNull(a):result_empty a.…

leetcode:反转字符串II

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseStr(string s, int k) {string s1;int i 0;//标记字符串下标int j 0;int length …

【长文梳理Webserver核心】框架篇

感谢前人的总结,让一个小白快速成长,那我也贡献一份自己的力量~ 大框架梳理从main函数开始学习 大框架梳理 先摆图: 目光先放到最上面的两个小框架,半同步/半反应堆线程池和异步日志系统,日志系统晓得伐?…

redis+mysql数据一致性+缓存穿透解决方案

在分布式事务中我们知道有cap定理,即 我们保证高可用的情况下,必然要牺牲一些一致性,在保证强一致性的情况下,必然会牺牲一些可用性。而我们redismysql数据一致性的使用策略就是在我们保证可用性的情况下尽量保证数据的一致性。想…

【高等代数笔记】线性空间(二十四下半部分-二十六)

3.23 子空间的运算 【推论1】 dim ⁡ ( V 1 V 2 ) dim ⁡ V 1 dim ⁡ V 2 ⇔ V 1 ∩ V 2 0 \dim(\textbf{V}_1\textbf{V}_2 )\dim\textbf{V}_1\dim\textbf{V}_2\Leftrightarrow\textbf{V}_1\cap\textbf{V}_2\textbf{0} dim(V1​V2​)dimV1​dimV2​⇔V1​∩V2​0 3.24 子…