TypeScript 枚举 Enum

JavaScript 本身是没有枚举的,Enum 是 TypeScript 带来的特性。

虽然早在 TypeScript 2.4 就已经提供了 Enum 但是并没有被广泛使用。TypeScript 一开始就有 Union Type,且语法更简单。因此 Enum 在 TypeScript 并不是必需的,出现较晚,且语法更加复杂,阻碍了它的流行。

但是,在大型项目中,Enum 有很多不可替代的优势,结合编辑器和IDE的功能,让类型的使用和维护更加轻松。

和 Union Type 比较

在 Enum 诞生之前,我们经常使用 Union Type 来表示枚举类型:

type Role = 'superadmin' | 'admin' | 'editor' | 'contributor';

const myRole: Role = 'editor';

如果改写成 Enum 的话:

enum Role {
  SuperAdmin = 'superadmin',
  Admin = 'admin',
  Editor = 'editor',
  Contributor = 'contributor',
}

const myRole = Role.Editor;

乍一看是不是代码繁琐了很多?那为什么我们还需要用 Enum 呢?Enum 和 Union Type 相比有两个优点:

  1. 可以对每个枚举成员添加注释
  2. 可以快速且精准地修改值和重命名

项目越大,类型也就会越多,相应的术语也就会越多。对每个枚举值成员添加注释,能够帮助新加入的开发者快速熟悉项目。尤其是国内的项目,中文的项目文档和英文代码之间的联系,注释必不可少。

/** 用户角色 */
enum Role {
  /** 超级管理员,可以增删管理员,配置和删除项目 */
  SuperAdmin = 'superadmin',
  /** 管理员,可以管理除了管理员外的成员角色 */
  Admin = 'admin',
  /** 编辑,可以直接编辑内容 */
  Editor = 'editor',
  /** 贡献者,可以参与讨论和提交补丁 */
  Contributor = 'contributor',
}

const myRole = Role.Editor;

当我们需要修改枚举值时,比如将 superadmin 改为 owner,Enum 就会非常简单。只需要将枚举值更改,而不需要去更改其他引用的地方。然而对于 Union Type,我们要小心翼翼地查找和替换每个出现的地方。加入我们想把 SuperAdmin 替换成 Owner,也只需要用 IDE 和编辑器提供的重命名/重构功能,快速而精确地重命名。这种维护的便利,也是 Enum 最大的魅力。

墓地

在大山的深处,有一个与外界少有往来的村庄,村民们过着自给自足的生活。一天,落难的传教士们在逃亡时误入此地。传教士们不擅长劳作,却会讲故事。他们编造了一个谎言,称村民们若不捐银钱求一块被祝福过的墓地,便会在死后受尽无数的折磨,灵魂不得安宁。村民们自此更加拼命劳作,开垦更多的土地,种植更多的粮食。即使如此,也少有人能捐得起一块墓地。久而久之,越来越多的人因辛劳而早亡。墓地越来越满,价格也水涨船高。人们开始互相抢夺和厮杀,而传教士们满载着钱财和粮食离开了。

单元测试:从 Jest 到 Karma+Mocha+Chai

我所参与过的 Web 项目大部分都使用 React 框架。Jest 是我们曾经最主要使用的单元测试 (Unit Test) 框架。Jest 配置足够简单,功能也足够丰富。但是随着前端开发逐渐进入深水区,Jest 的短板开始逐渐显现。我在经过探索和尝试后,迁移到了 Karma+Mocha+Chai 的解决方案。在此分享这两种技术方案的区别和取舍,希望对遇到同样问题的同学有所帮助。

继续阅读 →

前端必学&勿学清单(2022更新)

前端技术发展很快,有些技术如常青树,有些则已日渐式微。不断涌现的新技术,有的是真创新,有的是换汤不换药。本文希望帮助大家避免在没有学习价值的技术上浪费事件。

需要注意的是,仅凭个人经历去判断一项技术是不是不流行,是很片面的。很多人在整个职业生涯中都没有遇到过 Angular 项目,但这并不代表 Angular 没有人用。有人觉得 Vue 小众,是玩具,但是其生态仍然在蓬勃发展。本文尽量从技术架构和统计数据来分析,而非个人经验。

更新于 2022 年二月。

继续阅读 →

编程英语基础

编程是一门语言艺术。要写出赏心悦目的代码,最重要的便是恰当的命名变量,函数,类和包等。每种编程语言都自己独特的语法和代码风格。比如 C 语言常用 snake_case 命名,而 Java 语言用 camelCase 命名。这篇文章将不去探讨具体语言的特有规范,而是去介绍通用的命名的英语语法,比如变量类型与词性的关系,词组和短语的顺序,省略的用法,近义词的辨析等。示例以 Java/TypeScript 为主。正确示例标记为✔️,错误示例标记为❌。

本文有待完善,欢迎读者意见。

继续阅读 →

GODZILLA

哥斯拉系列的漫画,动画,电影已经非常多了。最开始喜欢哥斯拉只是单纯觉得撕裂夜空的原子吐息非常酷。最近几年重启的哥斯拉电影,在这些粉丝关注的点上还原得非常成功,但实质上并没有什么思考深度。庵野秀明的新哥斯拉,虽然被赋予了很多意义,但是呈现效果拉跨,挂羊头卖狗肉。让我印象最深刻的,反而是一部非常规的作品,虚渊玄和Netflix合作的哥斯拉动画电影三部曲:《哥斯拉:怪兽行星》,《哥斯拉:决战机械都市》,《哥斯拉:噬星者》。

继续阅读 →

夜归人

不论几时下班,总有同路人拖着同样疲惫的壳,歪歪扭扭地走着夜路。

结伴的人欢快地聊着天,直到在地铁口熟练地挥别。穿正装的人顿了一顿,点上一支烟,吸了两口便丢了,匆匆地走了。路边卖唱的母女在保安的注视下离开,笨重的音箱是无法抛弃的负担。大哥的断腿兀地横在路上,念着哦弥陀佛。卖红薯的异乡人,受夜色的庇护而未被驱赶。电瓶车像家乡的燕子一样灵巧,极限地滑过身旁,又倏然消失在还巢的鸟群里。

街道的灯光,污染了夜的纯净。

九点钟,路上游荡的身影依旧不见少。打工人三五成群,倚靠在电瓶车上闲谈打趣。寡言少语的人,吃完一盘炒粉,还坐在那里等着。超市店员叫卖着品相欠佳的柑桔,似在等换班。大姐们的广告位争夺战仍在继续。每次贴完租房广告,都会盯一会儿,免得被人覆盖。那种靠眼神就能判断对方贴的是哪张的炉火纯青,是我辈不曾到达的境界。

在附近住了一月有余,却记不起一个熟面孔。大概我也是不会有人注意到的那个。昏暗的走廊,布满锈迹和灰尘的铁门,狭小的居室,无暇拆开的行李。不去想太多的话,在陌生的城市生活也非难事。不去喜欢,不去讨厌,不去刻意了解它的一切。

感谢这个暂时的容身之所,让我还有力气幻想远方。

二十九岁生日记

这天只是普通地上着班,做着与平时无异的工作。想订个生日蛋糕,但并不喜欢吃。于是什么都没有准备。倒是老家三代人买了个生日蛋糕,远程庆祝了一番。外甥女这天学会了走路。

最近并不顺利呢,辗转反侧。似有什么带走了夏天温度,吸走了空气中稀薄的氧气。世界繁华热闹的背景音渐渐隐去,每一丝低声啜泣都汹涌而来。那些非常不好的事情,找不到人娓娓道来。如果说重来一次可以做到更好,便有责怪自己的理由。却好像每一步都已经用尽全力,怕得要死的时候,也还是埋头前进。

南方的热终于过去了,少了楼下摊档的吵闹,狭小的房间似乎也宽敞了一些。不甚和睦的邻居,也放下了争执。简单煮了一碗面,从此这里算是一个正式的落脚点了。

老人形容新人,总会用一个词:心气。不安于现状,心心念念着摇摇欲坠的理想乡。高谈阔论,热衷表达,沉浸于自我。这些略带贬义的描述,对我这样的人恰如其分。

要勇敢呀。