TS基础 —— 枚举

本文介绍了 TypeScript 中的枚举类型,包括数字枚举、字符串枚举、异构枚举及其用法,强调了枚举在代码中赋予数字或字符串含义的重要性,以及如何进行反向映射和常量与计算值的区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 为什么要使用枚举
    • 枚举允许我们在开发过程中,为一组数组中的每一个元素赋予名称,如现在我们有一个number类型数组[1,2,3],这时每个元素实际上没有明确的名称或意义,但是当我们使用枚举为这个数组的每个元素规定了名称,那么就很方便的对应起来了。
    enum liveStatus{
    	Living = 1,
    	reply,
    	ended
    }
    
    首先我们将这个数组定义了一个名称是liveStatus,表示这个数组表示的含义是直播的状态,依次元素1对应的名称是直播中(Living),元素2对应的名称是回放(reply),元素3对应的名称是已结束(ended)。
    这样当我们得到1,如从后端返回这个status是1,那么我们很容易可以从这个枚举中获取到对应的状态,实际上是正在直播。
  • 枚举简介

    • 枚举是一个键值对的形式,可以看成是JavaScript中的JSON对象一样。

    • TS使用 enum 关键词声明枚举。

    • 如何创建一个枚举,以数字枚举举例

      • 使用enum关键词,关键词后接枚举的名称,然后创建一个大括号块,并在这个块里指定枚举成员。
      enum Direction{
        North = 1,
        East, //默认递增,所以值是2
        South, //值是3
        West, //值是4
      };
      
  • 数字枚举

    • 数字枚举的成员都是number类型的。

    • 对于数字枚举,如果没有对枚举对象中的枚举成员赋值,那么会默认从枚举对象中的第一个枚举成员的值是0,并依次递增。

    • 如果想利用枚举对象的不同枚举成员获取不同的状态,那么可以使用switch。(因为后端返回enum类型的时候,尤其是数字枚举,只会返回对应的数字值)

      • enum liveStatus{
          Living = 1,
          reply,
          preview,
        }
        
        swicth (status)
        case liveStatus.Living:
         return '直播中'
        case liveSatus.reply:
         return '回放'
        case liveStatus.preview:
         return '预告'
        
        
    • 数字枚举的反向映射

      • 数字枚举允许从value访问到key的反向映射。

        enum device{
          phone = 1,
          notebook,
          desktop,
        }
        

        我们可以知道,phone对应的value是1,notebook对应的value是2,desktop对应的value是3。

        正常来说,我们可以利用notebook来访问到2

        console.log(device.notebook) //2
        

        对于数字枚举,我们也可以通过2来访问到notebook。

        console.log(device[2]) //notebook
        
  • 字符串枚举

    • 字符串枚举的枚举成员都是string类型。

    • 字符串枚举没有反向映射。

      enum device{
        phone = "1",
        notebook = "2",
        desktop = "3",
      }
      
    • 字符串枚举不能递增,所以必须对字符串枚举对象中的每一个枚举成员赋值。

      enum device{
        phone = "1",
        notebook
      }
      

      这样就会报错,错误是“枚举成员必须具有初始化表达式”。

  • 异构枚举

    • 一个异构枚举对象可以包括2种枚举成员

      • 数字枚举成员
      • 字符串枚举成员
    • 我们很少使用异构枚举

      enum Person{
        name = "aaa",
        age = 18
      }
      
    • 异构枚举中的常见错误

      enum Person{
        name = "aaa",
        age = 3*6
      }
      

      上面的枚举会报错,错误是“含有字符串值成员的枚举中不允许使用计算值”,含义是当枚举对象中存在有value是字符串的枚举成员的时候,不能将其他枚举成员的value设置为计算值。

  • 枚举成员的值的2种形式:计算值和常量

    • 枚举对象中的每一个枚举成员都对应一个value,这个value有2种形式,它可能是计算值 或 常量。

    • 我们可以通过枚举成员表达式来判断枚举成员的value是计算值还是常量。只要是枚举成员的value是枚举成员表达式,那么这个value一定是常量。

    • 判断是否是枚举成员表达式的方法

      • 当满足以下5个条件中的任一个,那么就是枚举成员表达式
        • 一个枚举表达式字面量(主要是字符串字面量或数字字面量)。
        • 一个对之前定义的常量枚举成员的引用
        • 带括号的常量枚举表达式
        • 一元运算符 ++、 – 其中任一个应用在了常量枚举表达式
        • 常量枚举表达式是二元运算符 + 、-、*、/、%、<<、>>、&、|、^的操作对象。如果求值后值为NaN或Infinity,那么会在编译阶段报错。
    • 常量例子

      enum Obj{
        index, //枚举表达式字面量
        index1 = index, //引用常量枚举成员
        age = 2 << 1, //枚举表达式字面量参与二元运算符
        num = 30 | 2,
        num1 = 10 + 29
      }
      
    • 计算值例子

      enum Obj{
        nameLen = 'aaa'.length, //不满足上面任何条件,那么是计算值
        num = Math.random() * 100
      }
      
### TypeScript 枚举定义和用法 #### 什么是枚举? 在 TypeScript 中,枚举(Enum)是一种特殊的数据类型,允许开发者定义一命名常量。使用枚举可以提高代码的可读性和维护性,因为它提供了一种方式来表示具有固定集合值的变量。 #### 如何定义枚举? 可以通过 `enum` 关键字定义一个枚举类型。下面是一个简单的例子: ```typescript enum Color { Red, Green, Blue } ``` 在这个例子中,我们创建了一个名为 `Color` 的枚举,其中包含了三个成员:`Red`, `Green`, 和 `Blue`[^1]。 默认情况下,枚举成员会从 `0` 开始依次分配数值。因此,在上面的例子中: - `Color.Red` 的值为 `0` - `Color.Green` 的值为 `1` - `Color.Blue` 的值为 `2` 如果需要自定义初始值,则可以直接指定第一个成员的值或者部分成员的值。例如: ```typescript enum ColorWithValues { Red = 1, Green = 2, Blue = 4 } console.log(ColorWithValues.Red); // 输出: 1 console.log(ColorWithValues.Green); // 输出: 2 console.log(ColorWithValues.Blue); // 输出: 4 ``` 还可以让某些成员继承前一成员的值加一的行为保持不变: ```typescript enum MixedColors { Red = 1, Orange, Yellow, Green = 10, Cyan, Blue } console.log(MixedColors.Orange); // 输出: 2 console.log(MixedColors.Cyan); // 输出: 11 ``` #### 反向映射功能 除了能够通过名字访问对应的值外,TypeScript 还提供了反向查找的功能——即可以根据值找到相应的名称。这使得我们可以轻松实现双向查询操作。 继续以上面提到过的汽车类型的例子为例: ```typescript enum CarType { Honda = 1, Toyota, Subaru, Hyundai } // 正向获取值 console.log(CarType.Honda); // 输出: 1 console.log(CarType.Toyota); // 输出: 2 // 反向根据值找名称 console.log(CarType[3]); // 输出: "Subaru" ``` 这里值得注意的是当尝试打印整个枚举对象时,可以看到内部结构实际上是由两部分成的一个普通 JavaScript 对象:一部分是从字符串到数字的映射;另一部分则是反过来的方向上的关联关系[^4]。 #### 常见应用场景 - **状态机**: 当应用程序中有多个离散的状态要处理的时候非常适合采用枚举形式表达这些可能取值。 - **配置选项**: 如果某个函数接受有限数量的不同输入作为参数之一的话也可以考虑利用枚举来进行约束从而减少潜在错误的发生几率。 #### 注意事项 尽管枚举非常有用但也存在局限之处比如它们会在最终生成出来的JS文件里留下痕迹(除非显式设置为const),所以在注重性能敏感场景下应谨慎权衡利弊后再决定是否引入此特性[^1]。 ```typescript function selectLanguage(lang: Lang): void {} let langSetting: string = 'English'; selectLanguage(langSetting as Lang); ``` 上述代码片段展示了如何强制转换(`as`)以解决类型不匹配问题的情况下的实际运用案例[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值