iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何理解TypeScript枚举类型
  • 585
分享到

如何理解TypeScript枚举类型

2023-06-25 11:06:05 585人浏览 独家记忆
摘要

本篇内容主要讲解“如何理解typescript枚举类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解TypeScript枚举类型”吧!前言:TypeScript 在 ES 原有类型基础上

本篇内容主要讲解“如何理解typescript枚举类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解TypeScript枚举类型”吧!

    前言:

    TypeScript 在 ES 原有类型基础上加入枚举类型,使得在 TypeScript 中也可以给一组数值赋予名字,这样对开发者比较友好,可以理解枚举就是一个字典。

    枚举类型使用enum来定义:

    enum Day {  SUNDAY,  MONDAY,  TUESDAY,  WEDNESDAY,  THURSDAY,  FRIDAY,  SATURDAY }

    上面定义的枚举类型的Day,它有7个值,TypeScript会为它们每个值分配编号,默认从0开始,在使用时,就可以使用名字而不需要记数字和名称的对应关系了:

    enum Day {  SUNDAY = 0,  MONDAY = 1,  TUESDAY = 2,  WEDNESDAY = 3,  THURSDAY = 4,  FRIDAY = 5,  SATURDAY = 6}

    下面是将上面代码转译为 JavaScript 后的效果:

    var Day = void 0;(function (Day) {  Day[Day["SUNDAY"] = 0] = "SUNDAY";  Day[Day["MONDAY"] = 1] = "MONDAY";  Day[Day["TUESDAY"] = 2] = "TUESDAY";  Day[Day["WEDNESDAY"] = 3] = "WEDNESDAY";  Day[Day["THURSDAY"] = 4] = "THURSDAY";  Day[Day["FRIDAY"] = 5] = "FRIDAY";  Day[Day["SATURDAY"] = 6] = "SATURDAY";})(Day || (Day = {}));

    可以看到,每一个值都被赋予了对应的数字。

    在TypeScript中,我们需要通过点的形式获取枚举集合中的成员:

    console.log(Day.SUNDAY)   // 0console.log(Day.MONDAY)   // 1

    说完枚举类型的基本使用,下面就来看一下常见的枚举类型。

    1. 数字枚举

    在上面的例子中,在仅指定常量命名的情况下,定义的就是一个默认从 0 开始递增的数字集合,称之为数字枚举。如果想要从其他值开始递增,可以将第一个值的索引值进行指定:

    enum Color {  Red = 2,  Blue,  Yellow}console.log(Color.Red, Color.Blue, Color.Yellow); // 2 3 4

    可以对一个字段指定一个索引值,那他后面没有指定索引值的就会依次加一:

    // 指定部分字段,其他使用默认递增索引enum Status {  Ok = 200,  Created,  Accepted,  BadRequest = 400,  Unauthorized}console.log(Status.Created, Status.Accepted, Status.Unauthorized); // 201 202 401

    除此之外,还可以给每个字段指定不连续的任意索引值:

    enum Status {  Success = 200,  NotFound = 404,  Error = 500}console.log(Status.Success, Status.NotFound, Status.Error); // 200 404 500

    数字枚举在定义值时,可以使用计算值和常量。但是要注意,如果某个字段使用了计算值或常量,那么该字段后面紧接着的字段必须设置初始值,这里不能使用默认的递增值了,来看例子:

    // 初值为计算值const getValue = () => {  return 0;};enum ErrorIndex {  a = getValue(),  b, // error 枚举成员必须具有初始化的值  c}enum RightIndex {  a = getValue(),  b = 1,  c}// 初值为常量const Start = 1;enum Index {  a = Start,  b, // error 枚举成员必须具有初始化的值  c}

    2. 字符串枚举

    TypeScript 将定义值是字符串字面量的枚举称为字符串枚举,字符串枚举值要求每个字段的值都必须是字符串字面量,或者是该枚举值中另一个字符串枚举成员:

    // 使用字符串字面量enum Message {  Error = "Sorry, error",  Success = "Hoho, success"}console.log(Message.Error); // 'Sorry, error'// 使用枚举值中其他枚举成员enum Message {  Error = "error message",  ServerError = Error,  ClientError = Error}console.log(Message.Error); // 'error message'console.log(Message.ServerError); // 'error message'

    注意:这里的其他枚举成员指的是同一个枚举值中的枚举成员,因为字符串枚举不能使用常量或者计算值,所以不能使用其他枚举值中的成员。

    3. 反向映射

    定义枚举类型的值时,可以通过 Enum['key'] 或者 Enum.key 的形式获取到对应的值 valueTypeScript 还支持反向映射,但是反向映射只支持数字枚举,不支持字符串枚举。

    来看下面的例子:

    enum Status {  Success = 200,  NotFound = 404,  Error = 500}console.log(Status["Success"]); // 200console.log(Status[200]); // 'Success'console.log(Status[Status["Success"]]); // 'Success'

    TypeScript 中定义的枚举,编译之后其实是一个对象,生成的代码中,枚举类型被编译成一个对象,它包含了正向映射( name -> value)和反向映射( value -> name)。

    下面来看看上面代码中的 Status 编译后的效果:

    {    200: "Success",    404: "NotFound",    500: "Error",    Error: 500,    NotFound: 404,    Success: 200}

    可以看到,TypeScript 会把定义的枚举值的字段名分别作为对象的属性名和属性值,把枚举值的字段值分别作为对象的属性值和属性名,同时添加到对象中。这样既可以通过枚举值的字段名得到值,也可以通过枚举值的值得到字段名。

    4. 异构枚举

    异构枚举就是枚举值中成员值既有数字类型又有字符串类型,如下:

    enum Result {  Faild = 0,  Success = "Success"}

    在开发过程中不建议使用异步枚举。因为往往将一类值整理为一个枚举值时,它们的特点是相似的。比如在做接口请求时的返回状态码,如果是状态码都是数值,如果是提示信息,都是字符串,所以在使用枚举的时候,往往是可以避免使用异构枚举的,主要是做好类型的整理。

    5. 常量枚举

    TypeScript中,定义了枚举值之后,编译成 javascript 的代码会创建一个对应的对象,这个对象可以在程序运行时使用。但是如果使用枚举只是为了让程序可读性好,并不需要编译后的对象呢?这样会增加一些编译后的代码量。TypeScript 中有一个const enum(常量枚举),在定义枚举的语句之前加上const关键字,这样编译后的代码不会创建这个对象,只是会从枚举里拿到相应的值进行替换:

    enum Status {  Off,  On}const enum Animal {  Dog,  Cat}const status = Status.On;const animal = Animal.Dog;

    上面的代码编译成 JavaScript 之后是这样的:

    var Status;(function(Status) {  Status[(Status["Off"] = 0)] = "Off";  Status[(Status["On"] = 1)] = "On";})(Status || (Status = {}));var status = Status.On;var animal = 0; // Dog

    对于 Status 的处理,先是定义一个变量 Status,然后定义一个立即执行函数,在函数内给 Status 添加对应属性,首先Status[“Off”] = 0是给Status对象设置Off属性,并且值设为 0,这个赋值表达式的返回值是等号右边的值,也就是 0,所以Status[Status[“Off”] = 0] = "Off"相当于Status[0] = “Off” 。创建了这个对象之后,将 Status 的 On 属性值赋值给 status;再来看下 animal 的处理,编译后的代码并没有像Status创建一个Animal对象,而是直接把Animal.Dog的值0替换到了const animal = Animal.Dog表达式的Animal.Dog位置。

    通过定义常量枚举,可以以清晰、结构化的形式维护相关联的常量集合。而且因为转译后抹除了定义、内联成员值,所以在代码的体积和性能方面并不会比直接内联常量值差。

    6. 枚举成员类型和联合枚举类型

    如果枚举值里所有成员都是字面量类型的值,那么枚举的每个成员和枚举值本身都可以作为类型来使用,我们称这样的枚举成员为字面量枚举成员。

    满足条件的枚举成员的值有以下三种:

    • 没有初始值的枚举成员,例如:enum E { A }

    • 值为字符串字面量,例如:enum E { A = 'a' }

    • 值为数值字面量,或者带有-符号的数值字面量,例如:enum E { A = 1 }、enum E { A = -1 }

    (1)枚举成员类型

    当所有枚举成员都拥有字面量枚举值时,就枚举成员成为了类型:

    enum Animal {  Dog = 1,  Cat = 2}interface Dog {  type: Animal.Dog; }interface Cat {  type: Animal.Cat; }let cat: Cat = {  type: Animal.Dog // error [ts] 不能将类型“Animal.Dog”分配给类型“Animal.Cat”};let dog: Dog = {  type: Animal.Dog};

    可以看到,代码的第七行使用Animal.Dog作为类型,指定接口Dog的必须有一个type字段,且类型为Animal.Dog

    (2)联合枚举类型

    当枚举值符合条件时,这个枚举值就可以看做是一个包含所有成员的联合类型:

    enum Status {  Off,  On}interface Light {  status: Status;}enum Animal {  Dog = 1,  Cat = 2}const light1: Light = {  status: Animal.Dog // error 不能将类型“Animal.Dog”分配给类型“Status”};const light2: Light = {  status: Status.Off};const light3: Light = {  status: Status.On};

    上面例子定义接口 Light status 字段的类型为枚举值 Status,那么此时 status 的属性值必须为 Status.Off 和 Status.On 中的一个,也就是相当于status: Status.Off | Status.On

    7. 枚举合并

    说完常见的枚举类型,最后来看看枚举合并的概念。对于枚举类型的值,我们可以分开进行声明:

    enum Day {  SUNDAY,  MONDAY,  TUESDAY }enum Day {  WEDNESDAY,  THURSDAY,  FRIDAY,  SATURDAY }

    这时 TypeScript 就会对这个枚举值进行合并操作,合并后编译为JavaScript的代码如下:

    var Day = void 0;(function (Day) {  Day[Day["SUNDAY"] = 0] = "SUNDAY";  Day[Day["MONDAY"] = 1] = "MONDAY";  Day[Day["TUESDAY"] = 2] = "TUESDAY";  Day[Day["WEDNESDAY"] = 3] = "WEDNESDAY";  Day[Day["THURSDAY"] = 4] = "THURSDAY";  Day[Day["FRIDAY"] = 5] = "FRIDAY";  Day[Day["SATURDAY"] = 6] = "SATURDAY";})(Day || (Day = {}));

    到此,相信大家对“如何理解TypeScript枚举类型”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: 如何理解TypeScript枚举类型

    本文链接: https://www.lsjlt.com/news/304266.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 如何理解TypeScript枚举类型
      本篇内容主要讲解“如何理解TypeScript枚举类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解TypeScript枚举类型”吧!前言:TypeScript 在 ES 原有类型基础上...
      99+
      2023-06-25
    • TypeScript枚举类型
      目录1.概述2.数字枚举2.1反向映射3.字符串枚举4.const枚举5.总结1.概述 所谓的枚举类型就是为一组数值赋予名字。 enum类型在C++、Java语言中比较常见,Typ...
      99+
      2022-11-12
    • 详解 TypeScript 枚举类型
      目录1. 数字枚举2. 字符串枚举3. 反向映射4. 异构枚举5. 常量枚举6. 枚举成员类型和联合枚举类型(1)枚举成员类型(2)联合枚举类型7. 枚举合并前言: TypeScri...
      99+
      2022-11-12
    • 如何分析TypeScript枚举类型
      这篇文章给大家介绍如何分析TypeScript枚举类型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.概述所谓的枚举类型就是为一组数值赋予名字。enum类型在C++、Java语言中比较常见,TypeScript在Ja...
      99+
      2023-06-22
    • TypeScript中枚举类型的理解与应用场景
      目录一、是什么二、使用数字枚举字符串枚举异构枚举本质三、应用场景总结一、是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为...
      99+
      2022-11-12
    • 详解Python中的枚举类型
      目录什么是枚举类型为什么要使用枚举如何使用枚举从字典创建枚举最后的话你好,我是 征哥,今天分享一下 Python 中的枚举类型,为什么需要枚举类型,及如何使用。 什么是枚举类型 枚举...
      99+
      2022-11-11
    • php如何实现枚举类型
      这篇文章主要介绍“php如何实现枚举类型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php如何实现枚举类型”文章能帮助大家解决问题。枚举类型优点枚举类型在编程中有很多优点,如下:可读性高:枚举类型...
      99+
      2023-07-05
    • C#枚举类型的基础讲解
      本篇内容主要讲解“C#枚举类型的基础讲解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#枚举类型的基础讲解”吧!对于C#枚举类型不仅可以提高程序的可读性,而且可以减少因底层值发生改变而导致的程...
      99+
      2023-06-18
    • Java枚举类型与泛型使用解读
      目录一、枚举类型1、使用枚举类型设置常量2、枚举类型常用方法3、枚举类型中的构造方法二、泛型1、泛型的常规用法2、泛型的高级用法总结一、枚举类型 1、使用枚举类型设置常量 以往设置常...
      99+
      2022-12-28
      Java枚举类型 Java泛型 Java枚举类型与泛型
    • 【Java系列】深入解析枚举类型
      序言 即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义。 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流 问题 思考一下这寄个问题,我们将围绕...
      99+
      2023-09-01
      java 开发语言 枚举
    • C语言枚举类型如何定义
      C语言枚举类型可以使用关键字`enum`来定义。定义枚举类型的语法格式如下:```cenum 枚举类型名 {枚举常量1,枚举常量2,...
      99+
      2023-10-10
      C语言
    • 如何在mysql中使用枚举类型
      小编给大家分享一下如何在mysql中使用枚举类型,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!枚举类型在mysql的使用方法:1...
      99+
      2022-10-18
    • python枚举类型定义与使用讲解
      目录1.定义2.使用3.枚举构造器1.定义 在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有 4 个对象;再比如行星类,目前只有 8 个对象。这种实例有限且固定的类,在 ...
      99+
      2022-11-11
    • Golang表示枚举类型的详细讲解
      枚举,是一种重要的数据类型,由一组键值对组成,通常用来在编程语言中充当常量的标识符。在主流行编程语言如 c、 java 等,都有原生支持。在 go 中,大家却找不到 enum 或者...
      99+
      2022-11-12
    • java中枚举类型的原理是什么
      java中枚举类型的原理是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面...
      99+
      2023-06-14
    • 详解在Go语言中如何实现枚举类型
      目录前言Go 语言中的 “枚举类型”使用 itoa 优雅实现枚举为自定义的枚举添加方法Name()OriginalString()Values()ValueO...
      99+
      2023-05-16
      Go语言实现枚举类型 Go实现枚举类型 Go语言 枚举
    • C++类常量和类枚举怎么理解
      这篇文章给大家介绍C++类常量和类枚举怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.类常量有的时候, 我们希望能给类当中定义一些常量,可以给所有类的对象使用。比如说我们在类当中定义一个数组,希望可以定义一个...
      99+
      2023-06-22
    • vue3声明字段名为枚举的类型详解
      目录vue3声明字段名为枚举类型下面是Type的枚举声明,共有6个字段vue使用提升之"枚举"应用方式一(适用于简易过滤器中)方拾二(过滤器,循环列表)vue3声...
      99+
      2022-11-13
    • Go iota关键字与枚举类型实现原理
      目录1. iota关键字2. 枚举类型1. iota关键字 iota是go语言的常量计数器,只能在常量的表达式中使用,其值从0开始,在const中每新增一行iota自己增长1,其值一...
      99+
      2022-11-11
    • Vue如何用枚举类型实现一个HTML下拉框
      本篇内容主要讲解“Vue如何用枚举类型实现一个HTML下拉框”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue如何用枚举类型实现一个HTML下拉框”吧!第一步: 编写下拉框需要的枚举类型&nb...
      99+
      2023-07-04
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作