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

三小时快速上手TypeScript之枚举

在TypeScript中,枚举(enum)是一种非常有用的数据类型,它允许开发者定义一组命名的常量。枚举可以提高代码的可读性和可维护性,同时还可以为变量提供有限的、预定义的值集合。

1. 枚举的基本概念

枚举是一种特殊的类,它包含一组预定义的常量值。每个枚举成员都有一个关联的值,这些值可以是数字或字符串。

(1)数字枚举

默认情况下,枚举成员的值是从 0 开始的递增整数。例如:

enum Color {Red,Green,Blue
}

在上面的代码中:

  • Color.Red 的值为 0
  • Color.Green 的值为 1
  • Color.Blue 的值为 2

你也可以手动为枚举成员指定值:

enum Color {Red = 1,Green = 2,Blue = 3
}

在这种情况下:

  • Color.Red 的值为 1
  • Color.Green 的值为 2
  • Color.Blue 的值为 3
(2)字符串枚举

从TypeScript 2.4开始,枚举成员的值也可以是字符串。例如:

enum Direction {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT"
}

在这种情况下,枚举成员的值是字符串,而不是数字。

2. 枚举的使用

枚举的主要用途是为变量提供一组预定义的值集合。例如:

let color: Color = Color.Red;
console.log(color); // 输出 0 或 "Red"(取决于枚举类型)
(1)枚举成员的访问

可以通过枚举名称访问枚举成员:

console.log(Color.Red); // 输出 0 或 "Red"
console.log(Color[0]); // 输出 "Red"(反向映射)

在数字枚举中,TypeScript会自动为枚举成员创建反向映射,即可以通过值获取对应的枚举名称。

(2)枚举的类型

枚举本身也是一种类型,可以用于类型注解:

function printColor(color: Color) {console.log(color);
}printColor(Color.Red); // 合法
printColor(0); // 合法,因为Color.Red的值是0
printColor("Red"); // 错误,类型不匹配

3. 枚举的高级用法

(3)计算属性

枚举成员的值可以是表达式的结果。例如:

const enum Color {Red = 1,Green = 2,Blue = 3,Yellow = Red + Green
}

在这种情况下,Color.Yellow 的值为 4

(4)联合枚举

可以将多个枚举组合在一起,形成联合枚举。例如:

enum Color {Red,Green,Blue
}enum Shape {Circle,Square,Triangle
}type ColorOrShape = Color | Shape;let colorOrShape: ColorOrShape = Color.Red; // 合法
colorOrShape = Shape.Square; // 合法
(5)常量枚举

常量枚举使用 const enum 定义。它与普通枚举的主要区别在于,常量枚举不会被编译成JavaScript代码,而是在编译时直接替换为对应的值。这可以减少代码体积。例如:

const enum Color {Red,Green,Blue
}let color: Color = Color.Red;
console.log(color); // 输出 0

在编译后的JavaScript代码中,Color.Red 会被直接替换为 0

4. 枚举的优缺点

(1)优点
  • 提高代码可读性:通过枚举,可以使用有意义的名称代替数字或字符串常量。
  • 类型安全:枚举提供了一种类型安全的方式,确保变量的值只能是枚举成员之一。
  • 易于维护:枚举的值可以集中管理,便于修改和扩展。
(2)缺点
  • 增加复杂性:如果枚举成员过多或过于复杂,可能会增加代码的复杂性。
  • 性能开销:虽然常量枚举可以减少代码体积,但普通枚举会在运行时占用一定的内存。

5. 总结

枚举是TypeScript中非常有用的特性,它可以帮助开发者定义一组预定义的值集合,提高代码的可读性和可维护性。通过合理使用枚举,可以编写出更加安全、规范的代码。

相关文章:

  • 【知识科普】HTTPS 加密中信息的可见性详解
  • [密码学实战]SDF之设备管理类函数(一)
  • 智能物证管理系统|DW-S404全国广泛应用
  • 关系数据的可视化
  • tanstack动态路由 + router/ 目录管理方案
  • 数据分析1
  • 一文读懂Tomcat应用之 CentOS安装部署Tomcat服务
  • LabVIEW开发之困境中逼出成长力
  • 基于 Spring Boot 瑞吉外卖系统开发(八)
  • 如何在idea中写spark程序。
  • 工业通讯现场中关于EtherCAT转TCPIP网关的现场应用
  • 【爬虫】码上爬第1题:动态数据采集
  • 4月28日星期一今日早报简报微语报早读
  • Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options
  • 软件设计师速通其一:计算机内部数据表示
  • C# wpf
  • 快速上手Prism WPF 工程
  • Python----卷积神经网络(卷积为什么能识别图像)
  • 普通IT的股票交易成长史--20250428晚
  • EXCEL中跨行匹配两组数据
  • 当隐身13年的北小京决定公开身份 ,专业戏剧评论依然稀缺
  • 他比李白接地气,比杜甫乐观,比白居易刚毅
  • 视频丨伊朗阿巴斯港一处油罐发生高强度爆炸:造成大面积破坏,伤亡不明
  • 如何做大中国拳击产业的蛋糕?这项赛事给出办赛新思考
  • 上海论坛2025年会聚焦创新的时代,9份复旦智库报告亮相
  • 新华时评·首季中国经济观察丨用好用足更加积极的财政政策