ts枚举类

article/2025/7/11 21:56:30

参考官方文档:https://www.tslang.cn/docs/handbook/enums.html

理解:枚举是列举固定几个值,直接定义变量的话的话可以随意定义,枚举只能使用你定义好的几个值,枚举是个类,定义的值是基本类型,类能有更多操作

    例如你定义一个方法接收一个参数,这个参数如果是int型,别人在调用你这个方法时可以传1或2等任意数字,虽然你告诉了同事,只能传0或1,
    如果你把参数定义成只能传某个类型,例如是个枚举类,那么别人只能传你枚举类里定义好的几个类型,传其它的就会在编译时期报错

 

数字枚举:

我们定义了一个数字枚举, Up使用初始化为 1。 其余的成员会从 1开始自动增长。 换句话说,Direction.Up的值为 1, Down为 2, Left为 3, Right为 4

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

我们还可以完全不使用初始化器:现在, Up的值为 0, Down的值为 1等等。 当我们不在乎成员的值的时候,这种自增长的行为是很有用处的,但是要注意每个枚举成员的值都是不同的。

enum Direction { Up, Down, Left, Right, }

通过枚举的属性来访问枚举成员,和枚举的名字来访问枚举类型:

enum Response {No = 0,Yes = 1,
}function respond(recipient: string, message: Response): void {// ...
}respond("Princess Caroline", Response.Yes)

不带初始化器的枚举或者被放在第一的位置,或者被放在使用了数字常量或其它常量初始化了的枚举后面。 换句话说,下面的情况是不被允许的

enum E {A = getSomeValue(), B, // error! 'A' is not constant-initialized, so 'B' needs an initializer
}
/*由于getSomeValue()不是一个初始常量(到运行时才能确定的值就不是constant值了),所以此时需要给B初始值*/

字符串枚举:

在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。

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

计算的和常量成员

// 以下所有枚举成员都是常量
enum E { X }
enum E1 { X, Y, Z }
enum E2 {A = 1, B, C
}enum FileAccess {None,Read    = 1 << 1,Write   = 1 << 2,ReadWrite  = Read | Write,// computed memberG = "123".length
}

联合枚举与枚举成员的类型

当枚举成员成为了类型

enum ShapeKind {Circle,Square,
}interface Circle {kind: ShapeKind.Circle;radius: number;
}interface Square {kind: ShapeKind.Square;sideLength: number;
}let c: Circle = {kind: ShapeKind.Square,//    ~~~~~~~~~~~~~~~~ Error!radius: 100,
}

当枚举类型本身变成了每个枚举成员的 联合
下面这个例子里,我们先检查 x是否不是 E.Foo。 如果通过了这个检查,然后 ||会发生短路效果, if语句体里的内容会被执行。 然而,这个检查没有通过,那么 x则 只能为 E.Foo,因此没理由再去检查它是否为 E.Bar

enum E {Foo,Bar,
}function f(x: E) {if (x !== E.Foo || x !== E.Bar) {//             ~~~~~~~~~~~// Error! Operator '!==' cannot be applied to types 'E.Foo' and 'E.Bar'.}
}

反向映射

enum Enum {A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
// 例如打印下Role 看看解雇
enum Role {Reporter = 1,Developer,Maintainer,Owner,Guest
} 

  

外部枚举

外部枚举用来描述已经存在的枚举类型的形状。

declare enum Enum {A = 1,B,C = 2
}

外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。

 

总结:

1.成员不初始化的话,默认是从0开始自增
enum Enum {A,B,C }
console.log(Enum); // {0: "A",1: "B",2: "C",A: 0,B: 1,C: 2}2.数字型的枚举可以映射,字符串类型的枚举是不可以映射的.
enum Enum {A,B}
enum Strs {A = 'apple',B = 'orange'}
console.log(Enum); // {0: "A",1: "B",A: 0,B: 1}
console.log(Strs ); // {A: "apple"B: "orange"}3.第一个成员初始化赋值为3的话,后面的成员从3开始增长
enum Enum {A = 3,B,C}
console.log(Enum); // {3: 'A',4: 'B',5:'C', A: 3,B: 4,C: 5}4.如果第n个成员初始化赋值为string类型,则n后面的成员要给初始值
enum Enum {A,B='apple',C}; // 此时C不初始化会报错  Enum member must have initializer5.不建议数字枚举和字符串枚举混用
enum Enum {A,B='apple',C}; 这种是不建议的6.常量枚举成员在编译阶段会被计算出结果,计算类枚举成员的值会被保留,只有到运行时才会被计算7.const声明的枚举是常量枚举,会在编译阶段被移出,意味着编译后没有任何代码的
当不需要对象,但需要一个对象的值的时候使用常量枚举
const enum Month { Jan, Feb, Mar, Apr }
let month = [Month.Jan, Month.Feb, Month.Mar]; 
// 编译的结果Month 是没有产生任何代码的
var month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];8.枚举类型:①.所有成员没有初始值       enum E { a, b }②.所有成员初始值为数字     enum F { a = 0, b = 1 } ③.所有成员初始值为字符串   enum G { a = 'apple', b = 'banana' }let e: E = 3, f: F = 4;let e1: E.a = 3, e2: E.b = 3, e3: E.a = 4;由于E和F是纯数字,所以可以把任意的number赋值给e和f.取值也可以超出枚举值  let e: E = 3 或 let e: E = E.a ;let g1:G = G.a, g2:G.b = G.bG的成员是字符串,只能是枚举成员的类型复制给g1和g2两种不同的枚举值是不可以比较的  e === f   // 报错:因为类型“E”和“F”没有重叠,所以只会返回falsee1 === e2 // 报错 ...e1 === e3 // 正确g1 === g2 // 报错 ,因为“E.a”和“E.b”类型没有重叠,所以只会返回false

 

 

 

 

 


http://chatgpt.dhexx.cn/article/JRDRy9ib.shtml

相关文章

Java 枚举类型原理分析为什么枚举比用静态变量多消耗两倍的内存

一 起源&#xff1a;枚举是一种特殊的数据类型&#xff0c;一般用来列举有限个、同类型的常量。它能保证参数的安全性&#xff0c;如方法声明传入的参数&#xff0c;必须是指定枚举中的常量。但是Android开发文档指出&#xff0c;使用枚举会比使用静态变量多消耗2倍内存。为什么…

java枚举转json

1、背景 java后端的枚举类型&#xff0c;要展示到前端&#xff0c;提供给用户进行下拉选择&#xff0c;java后端需要封装enum为json字符串提供给前端&#xff0c;需要首先将枚举类型转为list&#xff0c;然后再转为json字符串。 2、方案 方案也很简单&#xff0c;使用EnumSe…

枚举类的使用

文章目录 前言一、自定义枚举类二、使用enum定义枚举类1.Enum类的主要方法2.实现接口的枚举类 前言 1&#xff09; 类的对象只有有限个&#xff0c;确定的。举例如下&#xff1a; 星期&#xff1a;Monday(星期一)、…、Sunday(星期天) 性别&#xff1a;Man(男)、Woman(女) 季节…

用户名枚举

一. 漏洞描述 常存在于系统登录界面&#xff0c;由于错误配置或设计缺陷&#xff0c;当向系统提交有效账户和无效账户时&#xff0c;服务器会有不同的响应&#xff0c;利用服务器响应的不同&#xff0c;攻击者可以获取到系统已经存在的账户&#xff0c;可用于暴力破解&#xff…

c++枚举

一、枚举类型的定义 枚举类型的定义&#xff1a;枚举类型(enumeration)是 C 中的一种派生数据类型&#xff0c;它是由用户定义的若干枚举常量的集合。 定义格式&#xff1a;枚举类型的定义格式为&#xff1a;enum <类型名> {<枚举常量表>}; 例如&#xff1a; en…

java枚举类及面试题为什么枚举实现单例模式是安全的?

目录 枚举类为什么会有枚举类&#xff1f;枚举类的使用枚举类的常用方法枚举的构造 枚举类型能被反射吗&#xff1f;为什么枚举实现单例模式是安全的&#xff1f; 枚举类的优缺点 枚举类 为什么会有枚举类&#xff1f; 假如说程序中有一些颜色的状态&#xff0c;或者说消息的类…

什么是枚举?

枚举有两种存在形式&#xff1a; 第一种是计算机编程语言的一种数据类型&#xff0c;enum&#xff0c;即枚举类型。在实际问题中&#xff0c;一些变量的取值被限制在一个有限的范围内&#xff0c;例如&#xff1a;一个星期内只有七天&#xff0c;一年只有十二个月…C语言为此提…

什么是枚举【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;什么是枚举&#xff0c;枚举是如何定义、初始化的&#xff0c;以及枚举到底如何使用&#xff0c;还有枚举这种语法存在的优点有那些&#x1f440;。 文章目录 一、什么是枚举&#x1f356;二、枚举类型的定义&#x1f356;三、枚举…

输入文字后不会自动变长的下划线如何制作

问题&#xff1a;设置下划线时&#xff0c;随着文字增多&#xff0c;下划线延长&#xff0c;出现不对齐的情况 &#xff0c;如下图 解决&#xff1a;制作表格&#xff0c;把不需要的边框删除&#xff0c;就我现在需要的效果&#xff0c;实现步骤如下 制作表格 设置单元格的边距…

CSDN中用Markdown如何给文本加下划线(可延长下划线)

解决 使用<u></u>把文字包起来即可。 演示 <u>下划线</u>&#xff0c;效果&#xff1a; 下划线 如何延长下划线 如果想延长下划线&#xff0c;我们会发现直接打空格是没用的&#xff0c;<u>  下划线   </u>&#xff0c;效果&…

css鼠标划过文字出现往两边延伸的下划线

HTML&#xff1a; <div class"nav"><ul><li><a href"#">Gravit Designer</a></li><li><a href"#">Gravit Klex</a></li></ul></div> CSS&#xff1a; /*导航*/.nav{…

【深入理解JS核心技术】12. 什么是一阶函数

一阶函数是一个不接受另一个函数作为参数并且不返回函数作为其返回值的函数。 const firstOrder () > console.log("I am a first order function!"); 复制代码 函数名 函数名就是指向函数的指针&#xff0c;一个函数可以有多个名称。 function sum(num1, num2) …

一个正经的前端学习 开源 仓库(阶段十九)

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English github.com/webVueBlog/… 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;启发来自 淘宝大佬 冴羽 &#xff0c;初心做一个真正能帮助到大家的仓库。&#xff08;非常口语化的&#xff0c;手写总结&#x…

【深入理解JS核心技术】1.在 JavaScript 中创建对象的可能方式有哪些?

创建对象的方式&#xff1a; 创建空对象&#xff0c;可以使用Object构造函数。&#xff08;对象构造函数&#xff09; var object new Object(); 复制代码 可以使用Object的create方法通过将原型对象作为参数来创建一个新对象 var object Object.create(null); 复制代码 可以…

一个正经的前端学习 开源 仓库(阶段十七-440)

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English github.com/webVueBlog/… 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;启发来自 淘宝大佬 冴羽 &#xff0c;初心做一个真正能帮助到大家的仓库。&#xff08;非常口语化的&#xff0c;手写总结&#x…

【深入理解JS核心技术】11. 什么是一级函数

在 Javascript 中&#xff0c;函数是第一类对象。一等函数意味着当该语言中的函数被视为任何其他变量时。 例如&#xff0c;在这种语言中&#xff0c;一个函数可以作为参数传递给其他函数&#xff0c;可以由另一个函数返回&#xff0c;也可以作为一个值分配给变量。例如&#x…

一个正经的前端学习 开源 仓库(每日更新)-698道知识点

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;养成一个好习惯&#xff0c;遇见更好的 自己。一个人可能走得更快&#xff0c;但一群人会走得更远。&#xff08;非常口语化的&#xff0c;手写总结&#xf…

坚持每一天,不忘初心,正经的前端学习(705)

正经的前端学习 中文 | English 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;每天进步一点&#xff01;欢迎大家前来讨论&#xff0c;如果觉得对你的学习有一定的帮助&#xff0c;欢迎点个Star &#xff08;此仓库每天都会手动更新&#xff09; &#x1f339; &#x1f339…

VB.net:VB编程语言/VB.net语言编程的简介、IDE安装、学习路线(几十项案例代码实现)之详细攻略

VB.net&#xff1a;VB编程语言/VB.net语言编程的简介、IDE安装、学习路线(几十项案例代码实现)之详细攻略 目录 VB编程语言的简介 1、VB编程语言、VBA编程语言、VBS编程语言、VB.net编程语言对比 2、VB语言对比VB.net语言 (1)、VB6.0之前——.NET Framework 引入之前 (2)、…

vue3手动封装一个点击切换下滑线,事件委托,实现简易选项卡

点击切换下滑线 看看效果 body主要代码&#xff1a; 把点击事件绑定到父元素身上&#xff0c;因为把每个li都绑定一个事件工作量太大了&#xff0c;也不显示&#xff1b;所以利用事件委托 <ul click"disPlay"><li class"wy">网页端</l…