首页 > 解决方案 > 我可以询问在 Typescript(和字符串联合类型)中使用(或不使用)枚举的任何哲学原因吗

问题描述

这些天我在 Typescript 中学习了enumand的概念const enum,我很困惑。我知道这const enum将被转换为简单的值,而另一个则不会。enum我还了解使用字符串联合类型和普通类型(如迭代)之间的一些功能差异。

但我无法理解何时以及为什么我应该(不)使用 ( const) enum。我认为迭代enum不是那么普遍,很难预测他们是否会使用它。

有一篇文章(这是用韩语写的,对此感到抱歉)“tree-shaking 无法优化转译enum,因为它们是 IIFE”。(链接

我应该const enum毫不犹豫地使用,还是使用其他替代方法有更多的利弊:字符串联合类型。

TLDR

  1. 如果const enum比轻量级更轻enum,是否有任何实际使用理由enum
  2. 我已经知道Babel不能使用const enum. 在那种情况下,为什么有人使用enum而不是字符串联合类型,即使他们不迭代它。

标签: typescripttypesenumsconstantsunion

解决方案


我相信这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.

这一切都取决于。


推荐阅读