如何在 JavaScript 中实现类似 Swift 的枚举以及关联值?

2024-01-01

Swift 语言拥有出色的枚举支持。人们不仅可以用案例定义标准枚举,而且案例还可以具有“与其关联”的可选值。

例如,摘自 Swift 文档:

enum Barcode {
    case UPCA(Int, Int, Int, Int)
    case QRCode(String)
    case Other
}

这样就可以通过传入一个值来创建条形码枚举,如下所示:

var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)

并且switch on productBarcode稍后检索关联值(元组ints).


我一直在尝试实现这种enumJavaScript 系统(特别是 ES5),但我遇到了困难。构建枚举系统(尤其是具有关联值的枚举系统)的最佳方法是什么?


您可以使用受歧视联盟 https://www.typescriptlang.org/docs/handbook/advanced-types.html#discriminated-unions为了这。此示例使用 Typescript,但概念与 Javascript 类似,只是没有类型安全。

interface UPCA {
    kind: "UPCA";
    numberSystem: number;
    manufacturer: number;
    item: number;
    checkDigit: number;
}

interface QRCode {
    kind: "QRCode";
    data: string;
}

interface Other {
    kind: "Other";
}

type Barcode = UPCA | QRCode | Other;

然后您可以切换一个值Barcode并在检查判别式后访问关联值。

function printBarcode(barcode: Barcode) {
  switch (barcode.kind) {
    case "UPCA":
      console.log(`UPCA: ${barcode.numberSystem}-${barcode.manufacturer}`);
      break;
    case "QRCode":
      console.log(`QRCode: ${barcode.data}`);
      break;
    case "Other":
      console.log("Other barcode");
      break;
  } 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 JavaScript 中实现类似 Swift 的枚举以及关联值? 的相关文章

随机推荐

  • 改变轴样式python

    我正在用 python 绘制一个简单的指数衰减 cos 曲线图 代码如下 代码实际运行没有问题 我只是想知道是否有办法改变python显示图形的方式 而不是像这样被轴包围this https i stack imgur com KBtt4
  • Angularjs 和 Angular 之间的区别[重复]

    这个问题在这里已经有答案了 Angularjs 和 Angular 例如 cli 和版本 之间有什么区别 我想使用 Angular 但我不知道选择其中之一有何区别 我用谷歌搜索但没有明确提及它们之间的差异 AngularJS是第一个版本An
  • 不支持 Last 和 LastOrDefault

    我正在尝试获取列表中的第一个和最后一个值 查询运算符First 受支持 但是Last and LastOrDefault 给出一个错误 我使用的是Last 操作员错误 var purchaseBills db PurchaseBills O
  • 从长度超过 N 个字符的文本中提取单词 - RegEx/Java/Android [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的第一个要求是使用 Java 中的正则表达式从某些文本中提取所有单词 以下代码对我来说非常完美 String words text sp
  • 从android webview中的base64 url​​下载文件

    我正在编写一个 webview 应用程序 在其中我可以从 html 标签 url 下载文件到设备 我可以下载 png jpg pdf 等文件 但是当 url 是 base64 字符串值时我不知道如何下载它 有人可以帮助我实现这一目标吗 例如
  • AS3 setChildIndex 到前面

    有没有办法将特定的 movieClip 发送到舞台上所有其他 movieClip 的前面 我知道 setChildIndex 但我无法找到动态计算顶部位置的方法 您可以使用setChildIndex with numChildren set
  • Google Places API:“place_id”或“id”对于世界上的任何城市来说都是唯一的吗?

    当对某个位置执行自动完成 API 调用时 我请求来自 google 的 JSON 响应 id 和 place id 字符串有什么区别 这两个ID是世界上任何一个城市所独有的吗 谷歌地点是否为世界上的每个城市分配一个ID 例如 Somers
  • Spark 中 IF then ELSE 的等价物

    我早些时候在这里看到过这个问题 并从中吸取了教训 但是 我不确定为什么当我认为它应该起作用时会出现错误 我想在现有 Spark 中创建一个新列DataFrame通过一些规则 这是我写的 iris spark 是具有分类变量 iris spa
  • 如何使用 SSE 将 _m128i 转换为无符号整数?

    我制作了一个用于图像分离的功能 define ARGB COLOR a r g b a lt lt 24 r lt lt 16 g lt lt 8 b inline UINT PosterizeColor const UINT color
  • 如何使用 GQL 使用管理控制台数据存储区查看器插入记录

    是否可以使用 管理 gt 数据存储查看器 在数据存储中插入或更新实体 例如 执行类似的事情 INSERT INTO table VALUES Foo Bar 不适用于 GQL 但可以使用以下命令插入和更新实体数据存储查看器 To INSER
  • Google Calendar API“请求的最短修改时间太早了。”仅仅一天之后

    我的代码使用获取日历事件service events list 具有以下参数 timeMax 2015 11 13T04 12 44 263000Z timeMin 2014 05 17T04 12 44 263000Z updatedMi
  • 在 JSF 中验证类级别 bean 验证约束

    看来JSF 2 0并没有调用 类级别约束 引用自一个所以答案 https stackoverflow com a 9213763 1803692 JSF 2 0 不调用类级别验证约束 从JSF 验证 http www masterthebo
  • 设置 SCSS 颜色变量不起作用

    我想在 SCSS 中定义自己的颜色变量 但是如何定义呢 我检查了这个网站 https htmlcolorcodes com tutorials scss color variables 并做了那里描述的一切 但它不起作用 我已经安装了预处理
  • 在 ASPNET MVC 中通过身份验证提供 iCalendar 文件

    我正在尝试在我的 MVC 应用程序中提供 iCalendar 文件 ics 到目前为止一切正常 我有一部 iPhone 订阅了日历的 URL 但现在我需要为每个用户提供个性化的日历 在 iPhone 上订阅日历时 我可以输入用户名和密码 但
  • 我需要担心阻塞任务吗?

    我需要在多大程度上担心 NET 中的阻塞任务 即 NET 任务调度程序如何处理线程池中线程的阻塞和超额订阅 例如 如果我的任务中有一些 IO 我是否应该始终使用LongRunning暗示 或者任务调度程序启发式处理得更好吗 在C 中有一个O
  • 实现滑动刷新布局后,回收器视图无法正确滚动

    在实现 滑动刷新 视图之前 回收器视图运行顺利 但每当我尝试向下滚动回收器视图时 滑动刷新 都会干扰并阻碍滚动移动 这是问题的屏幕截图 请注意 当回收器视图向下滚动时 会出现滑动刷新布局 这是我的布局片段
  • 命令行 Java 调试器

    有没有好的java命令行调试器 我给了 JDB 一个机会 但命令行界面很糟糕 如果我想更改最后一行并重新执行它 我必须重新输入整行 点击 向上箭头 只会给我 A 包 类 方法名也没有完成 GDB 是一个不错的选择 但我不知道如何用它进行远程
  • R 中的全局变量和局部变量

    我是 R 的新手 我对 R 中局部变量和全局变量的使用感到很困惑 我在互联网上读到一些帖子说如果我使用 or lt 我将在当前环境中分配变量 并使用 lt lt 我可以在函数内部访问全局变量 然而 据我记得 在 C 中 每当在括号内声明变量
  • 如何将引号传递给javascript函数

    我有一个 javascript 函数 它接受包含引号的字符串并显示在输入字段中 但是这个函数不接受引号后面的字符串 function searchFormatter cellvalue options rowObject return
  • 如何在 JavaScript 中实现类似 Swift 的枚举以及关联值?

    Swift 语言拥有出色的枚举支持 人们不仅可以用案例定义标准枚举 而且案例还可以具有 与其关联 的可选值 例如 摘自 Swift 文档 enum Barcode case UPCA Int Int Int Int case QRCode