6. TypeScript的枚举类型

在TypeScript中,枚举(Enum)是一种特殊的数据类型,它允许为一组数值赋予友好的名字。枚举类型在处理一组相关常量时非常有用,比如状态码、方向、月份等。本文将从多个方面深入探讨TypeScript中枚举类型的使用,包括基本用法、异构枚举、常量枚举、反向映射、枚举成员类型和枚举的高级应用等。

基本用法

在TypeScript中定义一个枚举非常简单,使用enum关键字即可。

enum Direction {Up,Down,Left,Right
}

默认情况下,枚举的第一个成员的值为0,后续成员的值依次递增。你也可以手动指定成员的数值。

enum StatusCode {Success = 200,NotFound = 404,ServerError = 500
}

异构枚举

TypeScript允许枚举包含字符串和数字成员,这种枚举被称为异构枚举。

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

虽然这种用法不是很常见,但在某些特殊情况下可能会有用。

常量枚举

使用const关键字定义的枚举称为常量枚举。常量枚举在编译阶段会被完全删除,它们的成员会在使用的地方被内联进来。

const enum Directions {Up,Down,Left,Right
}let directions = [Directions.Up, Directions.Down];

常量枚举的优点是在编译后的代码中可以减少额外的代码量。

字符串枚举

字符串枚举是一种枚举类型,它的每个成员都必须用字符串字面量或另一个字符串枚举成员进行初始化。

enum Message {Success = "Congratulations!",Fail = "Try again!"
}

字符串枚举没有反向映射(从枚举值到枚举名的映射),这是它与数字枚举的一个主要区别。

反向映射

TypeScript的数值枚举具有反向映射的特性,即你可以从枚举值访问到枚举名。

enum Enum {A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"

枚举成员的值

枚举成员可以是常量或计算得出的值。常量枚举成员在枚举定义时就已经确定了值,而计算所得枚举成员的值则是在运行时计算得出。

enum FileAccess {// 常量成员None,Read    = 1 << 1,Write   = 1 << 2,ReadWrite  = Read | Write,// 计算得出的成员G = "123".length
}

同名枚举的合并

TypeScript的枚举类型支持声明合并,即同名的枚举类型会被合并为单一类型。

enum BoxSize {Small,Medium
}enum BoxSize {Large = 2,XLarge,XXLarge
}// BoxSize 现在包含:Small, Medium, Large, XLarge, XXLarge

这种合并行为允许你将一个枚举类型分散到多个位置定义,TypeScript编译器会将它们合并为一个枚举。

keyof运算符

keyof运算符可以与枚举一起使用,以获取枚举的所有键的联合类型。

enum UserResponse {No = 0,Yes = 1,
}type UserResponseKeys = keyof typeof UserResponse;
// UserResponseKeys 的类型是 "No" | "Yes"

这种模式在需要根据枚举的键来约束某些值时非常有用。

枚举的类型安全性

使用枚举可以提高代码的类型安全性。当你尝试将任意值赋给枚举类型的变量时,TypeScript会进行类型检查。

enum Status {Active,Inactive,Paused
}let currentStatus: Status = Status.Active;// 错误:不能将类型“number”分配给类型“Status”
currentStatus = 123;

枚举的高级应用

枚举类型在实际开发中的应用非常广泛,比如用于状态管理、配置项的定义、权限控制等。通过枚举,我们可以使代码更加清晰和易于维护。

使用枚举进行状态管理

enum LoginState {BeforeLogin,Success,Failure
}function login(): LoginState {// 登录逻辑return LoginState.Success; // 假设登录成功
}let state = login();
if (state === LoginState.Success) {console.log("登录成功!");
}

使用枚举定义配置项

enum LogLevel {Error,Warn,Info,Debug
}function log(message: string, level: LogLevel) {// 日志记录逻辑
}log("This is an error message", LogLevel.Error);

枚举类型是TypeScript中一个非常有用的特性,它可以帮助我们以类型安全的方式处理一组相关的值,并且更加容易阅读和理解,代码也更加优雅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么 MySQL 采用 B+ 树作为索引?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 「为什么 MySQL 采用 B 树作为索引&#xff1f;」这句话&#xff0c;是不是在面试时经常出现。 要解释这个问题&#xff0c;其实不单单要从数据结构的角度出发&#xff0c;还要考虑磁盘 I/O 操作次数&am…

【javaWeb】EL与JSTL

目录 EL表达式&#xff08;Expression Language&#xff09;EL和JSP脚本的区别语法EL操作符EL运算符注意 EL功能EL访问作用域隐式对象示例1&#xff1a;获得应用上下文示例2&#xff1a;获取Cookie对象 JSTL(JavaServerPages Standard Tag Library)JSTL使用步骤JSTL标签分类使用…

【免费题库】华为OD机试 - 单词重量(Java JS Python C C++)

须知 哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 文章目录 须知题目描述输入描述输出描述用例解题思路:Java代码:JS代码:Python代码:C代码:C++代码:题目描述 每个句子由多个单词组成,句子中的每个单词的长度都可能不一样,…

【六 (3)机器学习-机器学习建模步骤/kaggle房价回归实战】

目录 文章导航一、确定问题和目标&#xff1a;1、业务需求分析&#xff1a;2、问题定义&#xff1a;3、目标设定&#xff1a;4、数据可行性评估&#xff1a;5、资源评估&#xff1a;6、风险评估&#xff1a; 二、数据收集&#xff1a;1、明确数据需求2、选择数据来源3、考虑数据…

SpringCloud Alibaba Seata 处理分布式事务

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十八篇&#xff0c;即使用 Seata 处理分布式事务。 二、分布式事务问题 当单体应用被拆分成微服务应用…

实现虚拟机Ubuntu与主机Windows之间的复制粘贴

实现步骤 在虚拟机Ubuntu界面&#xff0c;CtrlAltT&#xff0c;新建一个终端 # 卸载已有的工具 sudo apt-get autoremove open-vm-tools# 安装工具open-vm-tools sudo apt-get install open-vm-tools# 安装open-vm-tools-desktop sudo apt-get install open-vm-tools-desk…

【超简单】基于PaddleSpeech搭建个人语音听写服务

一、【超简单】之基于PaddleSpeech搭建个人语音听写服务 1.需求分析 亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?当您面对成吨的会议录音,着急写会议纪要而不得不愚公移山、人海战术?听的头晕眼花,听的漏洞百出,听的怀疑人生,那么你…

在Android中使用MediaPlayer播放音频和视频

在播放音频中SoundPool是个很好用的类&#xff0c;但是SoundPool只能播放音频&#xff0c;且通常只用来播放较短的音频&#xff0c;这就需要另外的类来实现视频和长音频的播放&#xff0c;那就是MediaPlay 实现MediaPlay的基本步骤是 创建MediaPlay对象调用setDataSource对象…

代码随想录算法训练营Day48|LC198 打家劫舍LC213 打家劫舍IILC337 打家劫舍III

一句话总结&#xff1a;前两题白给&#xff0c;第三题树形DP有点难。 原题链接&#xff1a;198 打家劫舍 滚动数组直接秒了。 class Solution {public int rob(int[] nums) {int n nums.length;int first 0, second nums[0];for (int i 2; i < n; i) {int tmp Math.m…

如何开始用 C++ 写一个光栅化渲染器?

光栅化渲染器是计算机图形学中最基础且广泛应用的一种渲染技术&#xff0c;它将三维模型转化为二维图像。下面我们将逐步介绍如何使用C语言从零开始构建一个简单的光栅化渲染器。 一、理解光栅化渲染原理 光栅化是一种将几何数据&#xff08;如点、线、三角形&#xff09;转换…

电商选品难?那是因为你不会用大数据选品工具…

电商选品之所以难&#xff0c;主要有以下几个方面的原因。电商市场更新换代非常快&#xff0c;新的产品不断涌现&#xff0c;旧的产品可能很快就被淘汰。电商选品紧跟市场趋势&#xff0c;不断调整和更新&#xff0c;这对电商运营市场敏感度和反应速度提出了很高的要求。 电商…

110V降9V1A非隔离降压恒压WT5112

110V降9V1A非隔离降压恒压WT5112 嘿&#xff0c;让我来给你说说这个WT5112控制芯片。这可是个厉害的东西&#xff0c;特别适合用在充电器啊、适配器啊还有LED灯这些地方。它最牛的地方就是能稳稳地控制电压和电流&#xff0c;而且还有个什么原边反馈技术让控制得更准。更酷的是…

MySQL_00001_00000

数据准备 员工表&#xff1a;emp Oracle: create table emp ( empno number(4) not null, ename varchar2(10), job varchar2(9), mgr number(4), hiredate date, sal number(7, 2), comm number(7, 2), deptno number(2) ); insert into em…

数据库讲解---(SQL语句--表的使用)【MySQL版本】

零.前言 数据库讲解&#xff08;MySQL版&#xff09;&#xff08;超详细&#xff09;【第一章】-CSDN博客 数据库-ER图教程_e-r图数据库-CSDN博客 数据库讲解&#xff08;MySQL版&#xff09;&#xff08;超详细&#xff09;【第二章】【上】-CSDN博客 一.SQL概述 1.1SQL简…

组合逻辑电路中的竞争与冒险

竞争与冒险 进行理想的组合逻辑电路分析与设计时&#xff0c;没有考虑逻辑门的延迟时间&#xff08;原因&#xff09;对电路产生的影响&#xff0c;且认为电路的输入和输出均处于稳定的逻辑电平。 实际上&#xff0c;信号经过逻辑门需要一定的时间。不同路径上门电路数目不同…

【Qt】文件与音视频

目录 一、输入输出设备类 二、文件读写类 三、文件和目录信息类 四、音视频 4.1 音频 4.2 视频 文件操作是应用程序必不可少的部分。Qt作为一个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt提供了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操作…

杂谈 EV之我见

每周至少更新一片博文&#xff0c;没有目的的看代码是没有效率的&#xff0c;带着目的去看代码才会有所得&#xff0c; 目前车载行业火爆&#xff0c;得益于EV和AI技术的发展&#xff0c;汽车从一个传统工业产品&#xff0c;摇身一变成为了前沿科技产品。 小米su7的发布会我看…

LeetCode刷题之94.二叉树中序遍历

文章目录 1. 描述2. 分析2.1 递归方法2.2 迭代 3. 解答3.1 递归3.2 迭代 1. 描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;ro…

C++ //练习 12.3 StrBlob需要const版本的push_back和pop_back吗?如果需要,添加进去。否则,解释为什么不需要。

C Primer&#xff08;第5版&#xff09; 练习 12.3 练习 12.3 StrBlob需要const版本的push_back和pop_back吗&#xff1f;如果需要&#xff0c;添加进去。否则&#xff0c;解释为什么不需要。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1…

浏览器工作原理与实践--页面性能:如何系统地优化页面

在前面几篇文章中&#xff0c;我们分析了页面加载和DOM生成&#xff0c;讨论了JavaScript和CSS是如何影响到DOM生成的&#xff0c;还结合渲染流水线来讲解了分层和合成机制&#xff0c;同时在这些文章里面&#xff0c;我们还穿插说明了很多优化页面性能的最佳实践策略。通过这些…