typescript - 我可以询问在 Typescript(和字符串联合类型)中使用(或不使用)枚举的任何哲学原因吗
问题描述
这些天我在 Typescript 中学习了enum
and的概念const enum
,我很困惑。我知道这const enum
将被转换为简单的值,而另一个则不会。enum
我还了解使用字符串联合类型和普通类型(如迭代)之间的一些功能差异。
但我无法理解何时以及为什么我应该(不)使用 ( const
) enum
。我认为迭代enum
不是那么普遍,很难预测他们是否会使用它。
有一篇文章(这是用韩语写的,对此感到抱歉)“tree-shaking 无法优化转译enum
,因为它们是 IIFE”。(链接)
我应该const enum
毫不犹豫地使用,还是使用其他替代方法有更多的利弊:字符串联合类型。
TLDR
- 如果
const enum
比轻量级更轻enum
,是否有任何实际使用理由enum
? - 我已经知道
Babel
不能使用const enum
. 在那种情况下,为什么有人使用enum
而不是字符串联合类型,即使他们不迭代它。
解决方案
我相信这enums
是从C#
. 一般来说enums
,TypeScript 中的数字是不安全的。考虑这个例子:
const enum Foo{
a,
b
}
const handle=(arg:Foo)=>arg
handle(42) // no error
这是因为 TypeScript 具有结构类型系统,而不是名义上的。
Nonconst enum
产生很多样板代码:
var Foo;
(function (Foo) {
Foo[Foo["a"] = 0] = "a";
Foo[Foo["b"] = 1] = "b";
})(Foo || (Foo = {}));
所以,我的建议是完全避免enums
。您可以改用不可变对象。考虑这个例子:
const Foo = {
a: 1,
b: 2
} as const;
type Values<T> = T[keyof T]
type Foo = Values<typeof Foo>;
const handle = (arg: Foo) => arg
handle(Foo.a) // ok
handle(Foo.b) // ok
handle(42) // error
至于string unions
,想象一下这种情况:
enum Events {
click = 'click',
hover = 'hover'
}
type Union = 'click' | 'hover'
您Events.click
在 100 个文件中用作值,然后您的技术负责人说您应该重命名click
为_click
. 你接下来做:
enum Events {
click = '_click',
hover = '_hover'
}
就是这样。您只需要更改一个类型声明,而在联合字符串的情况下,您需要替换文字字符串的每次使用。这只是一种情况。我相信联合字符串有很多用例。假设您有某种类型需要使用字符串文字。没有理由仅仅为了表示一种类型而创建运行时值。这是使用字符串文字而不是enums
.
这一切都取决于。
推荐阅读
- python - Django 自定义用户模型添加属性
- android - Room - 如何从选择 String 和 Int 的查询中返回新的自定义类型?
- heroku - 有没有办法在 Hasura graphql 中为整个模式(整个表)设置权限,而不是授予每个表的权限?
- php - Composer 安装 VirtualAlloc() 失败:[0x00000008]
- c++ - 如何在用户给定号码的前面和后面添加一个数字?C++
- python-3.x - 无法导入名称“AsyncIOSchedular”
- android - 如何在 Android Studio 中清除 RequestQueue 缓存?
- c++ - Yocto中的虚拟键盘顶部黑屏
- scala - scala.Char 在隐式范围内没有可用的 play.api.libs.json.Format 实例
- javascript - 如何修复 IE8 中的“indexof”