当前位置: 首页 > news >正文

TypeScript深度剖析:TypeScript 中枚举类型应用场景?

文章目录

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

一、是什么

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

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

在日常生活中也很常见,例如表示星期的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 等等状态的时候,我们都可以通过枚举去定义,这样可以提高代码的可读性,便于后续的维护

相关文章:

  • Maven Repository使用
  • 进程空间管理:用户态和内核态
  • 微信小程序——简易复制文本
  • SpringCloud(七) Feign远程调用
  • 项目实战:给首页上库存名称添加超链接然后带fid跳转到edit页面
  • K8S的pod创建过程
  • Star History 九月开源精选 |开源 GitHub Copilot 替代
  • 某数据库为提升搜索效率,对某一整型字段构建二叉搜索树(BST)
  • vue2+antd——实现动态菜单路由功能——基础积累
  • 基于CMFB余弦调制滤波器组的频谱响应matlab仿真
  • Capybara库如何批量下载新浪图片
  • Vue 3与Vite项目入门指南
  • excel求差公式怎么使用?
  • 驱动开发11-1 编写IIC驱动-读取温湿度数据
  • 如何将你的PC电脑数据迁移到Mac电脑?使用“迁移助理”从 PC 传输到 Mac的具体操作教程
  • 【翻译】babel对TC39装饰器草案的实现
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • jquery ajax学习笔记
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Odoo domain写法及运用
  • React16时代,该用什么姿势写 React ?
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue-cli3搭建项目
  • WePY 在小程序性能调优上做出的探究
  • 排序算法学习笔记
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 深度学习在携程攻略社区的应用
  • 使用Gradle第一次构建Java程序
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 积累各种好的链接
  • (12)Linux 常见的三种进程状态
  • (42)STM32——LCD显示屏实验笔记
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Java)【深基9.例1】选举学生会
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (四)Linux Shell编程——输入输出重定向
  • (一)kafka实战——kafka源码编译启动
  • (转)ABI是什么
  • (转)Google的Objective-C编码规范
  • (转载)Linux 多线程条件变量同步
  • ***监测系统的构建(chkrootkit )
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET轻量级ORM组件Dapper葵花宝典
  • :中兴通讯为何成功
  • [51nod1610]路径计数
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [C# WPF] 如何给控件添加边框(Border)?
  • [CSS]文字旁边的竖线以及布局知识