玩转TypeScript枚举

前言


😎在我们来详细介绍枚举前,不如先从编程世界的整体上来了解下枚举,我们首先看下其他语言的枚举类型,虽然在JS中没有枚举类型,但是在其他编程语言里面其实早就是老朋友了,我们先看下C#Java中的枚举的使用方法。在 C# 中,枚举类型使用 enum 关键字来定义。与 TypeScript 类似,C# 的枚举类型也允许为一组相关的常量值分配名称。C# 的枚举类型默认基于整数,并且可以手动指定每个常量值的整数值或使用隐式递增。以下是一个示例:

js 复制代码
enum DayOfWeek {
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
    }

在 Java 中,枚举类型使用 enum 关键字来定义。Java 的枚举类型与 TypeScript 的枚举类型类似,允许为一组相关的常量值分配名称。Java 的枚举类型可以包含方法、字段和构造函数。以下是一个示例:

js 复制代码
enum Size {
    SMALL,
    MEDIUM,
    LARGE
}

🫥其实在TypeScript中的使用方法和写法和C#中的写法一模一样,我们来看下在TypeScript中枚举写法

js 复制代码
enum Person{
  WOMAN,
  MAN
}

二.枚举的用法汇总


🤗关于枚举的用法我会从上面四个部分进行拆分介绍,具体分为普通枚举 枚举延迟求值 数字枚举 字符枚举 枚举扩展等几个方面展开。

三.常量枚举(普通枚举)


🫥上述图中并没有标注常量枚举,因为它是枚举中最普通的用法,所以我比较喜欢称之为普通枚举,普通枚举的使用方法非常的简单,下边例子我们写了一个关于人的枚举,枚举的取值方式和JS中对象的取值方式一样,但是不同点在于枚举可以双向映射简而言之就是,通过key可以获得value通过value可以获得key,具体转为JS的细节我们不需要去了解,我们就把TS当作一门类似于C#的语言来学习就好。

js 复制代码
enum Person{
    RIBEN,
    MEIGUO,
    YINGGUO,
}
console.log(Person[0])
console.log(Person.RIBEN)

四.数字枚举与字符枚举


🥱我们对上面的那个枚举进行修改,为后两个枚举分别添加上数字和字符串的值,并且在TS中枚举的值只能是数字或者字符串。

js 复制代码
enum Person{
    YINGGUO,
    RIBEN = 599,
    MEIGUO = "En",
}

既然看到这里不妨我们来解决一个报错,报错内容如下所示,普通枚举放到最后为什么报错了?我们思考一下,普通枚举在通过keyvalue值的时候取到的值是下标,那么如果把它放在字符串枚举的后边它该如何取值?所以我们可以参考下面的运行结果来解决,解决的办法就是要把这个普通的枚举放在字符串枚举值的上边。

🫥总结一下就是,数字枚举就是一种特殊的普通枚举,只不过是自己限定了值,这样的话其实就很清楚了,枚举分为两类:普通枚举 字符枚举

五.延迟求值枚举


😎延迟求值枚举就是,值先不确定,在使用的时候再进行计算,可以简单理解为懒加载相关的内容,我们可以看下这个例子,我们依然要注意上方那种报错的问题。

js 复制代码
const sum = ()=> 45 + 34

enum Num{
    ONE = sum(),
    THREE = 455,
    TWO,
}
console.log(Num.ONE) // 79
console.log(Num.TWO) // 455
console.log(Num.THREE) // 456

六.枚举扩展


🫥假设你正在开发一个音乐播放器应用程序。请定义一个枚举类型 MusicGenre,包含以下音乐风格的成员:

Pop Rock HipHop Jazz EDM,然后,请定义一个函数 getSongRecommendation,该函数接受一个 MusicGenre 类型的参数,并根据传入的音乐风格返回一个对应的歌曲推荐。

  1. getSongRecommendation 函数的返回类型为字符串。
  2. 如果传入的音乐风格是 Pop,则返回 "Dance Monkey"。
  3. 如果传入的音乐风格是 Rock,则返回 "Bohemian Rhapsody"。
  4. 如果传入的音乐风格是 HipHop,则返回 "Lose Yourself"。
  5. 如果传入的音乐风格是 Jazz,则返回 "Take Five"。
  6. 如果传入的音乐风格是 EDM,则返回 "Wake Me Up".

你需要完成的部分是定义枚举类型和编写 getSongRecommendation 函数的实现。

js 复制代码
enum MusicGenre {
  // 在这里定义音乐风格的枚举成员
}

function getSongRecommendation(genre: MusicGenre): string {
  // 在这里根据传入的音乐风格返回对应的歌曲推荐
}

// 测试代码
const popSong = getSongRecommendation(MusicGenre.Pop);
console.log(popSong); // 应该输出 "Dance Monkey"
js 复制代码
enum MusicGenre {
    Pop = "Dance Monkey",
    Rock = "Bohemian Rhapsody",
    HipHop = "Lose Yourself",
    Jazz = "Take Five",
    EDM = "Wake Me Up",
}
function getSongRecommendation(genre: MusicGenre): string {
return genre
}
getSongRecommendation(MusicGenre.Pop)
console.log(getSongRecommendation(MusicGenre.Pop));
相关推荐
寅时码26 分钟前
React 之死·终章:一个 useRef,把闭包陷阱、依赖数组、漫天 rerender 全送走
前端·react.js·ai编程
不好听61330 分钟前
HTML 事件监听机制:从 DOM Level 0 到 React 合成事件
前端·react.js·html
wordbaby38 分钟前
为什么刷新页面就 404?聊聊 SPA 路由与 Nginx 的那点事
前端
不好听6131 小时前
React 核心概念:JSX、组件与数据驱动
前端·react.js
触底反弹1 小时前
🔥 React 零基础入门(中):500 行屎山代码到组件化的蜕变
前端·javascript·react.js
不好听6131 小时前
React vs Vue:两大前端框架技术选型深度对比
前端·vue.js·react.js
GuWenyue1 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
GuWenyue1 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
小林ixn2 小时前
从 onclick 到 React 合成事件,再到完整应用逻辑:一次前端架构的深度剖析
前端·react.js·前端框架
Csvn3 小时前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端