TypeScript 中 Enums 的使用详解

阅读时长 4 分钟读完

Enum 是 TypeScript 中提供的一种枚举类型,它允许我们定义一系列常量,并且可以按照一定规则自动打上顺序编号。这可以让我们更方便地管理一些开发中经常用到的常量。

基本用法

Enum 的定义方式很简单,使用关键字 enum,然后列出常量即可,示例代码如下:

-- -------------------- ---- -------
---- ---- -
  -------
  --------
  ----------
  ---------
  -------
  ---------
  ------
-

------------------------ -- -
------------------------- -- -
-------------------- -- -----------

上面的例子定义了一个 Days 的 Enum,包含了一周的所有日子。我们可以通过 Days.Monday 这样的方式来访问这些常量,或者通过下标来访问,如 Days[2] 就可以得到 "Wednesday"

Enum 默认是从 0 开始自动计数的,但也可以手动指定常量的值,示例代码如下:

-- -------------------- ---- -------
---- ---- -
  ------ - --
  --------
  ----------
  ---------
  -------
  ---------
  ------
-

------------------------ -- -
------------------------- -- -

这里手动指定了 Monday 的值为 1,那么后面的常量就会自动从 2 开始编号了。

数字枚举和字符串枚举

Enum 有两种类型:数字枚举和字符串枚举。前面的示例代码就是数字枚举,它可以自动编号,并且我们也可以手动指定编号。字符串枚举在定义时需要手动指定每个常量的值,示例代码如下:

注意这里不能用下标访问,因为我们没有手动指定常量的编号。

常量表达式和常量枚举

常量表达式是指在编译期就可以确定值的表达式。在 Enum 中,如果每个常量的值都是常量表达式,那么这个 Enum 就是常量枚举,可以在编译后被删除,并且常量枚举的访问速度也会比普通 Enum 快。

示例代码如下:

-- -------------------- ---- -------
----- ---- ---------- -
  -- - -----
  ---- - -------
  ---- - -------
  ----- - -------
-

-------------------------- -- ----
-------------------------- -- ---------

注意这里使用了 const 关键字来限制 Enum 的类型,并且因为每个常量都是常量表达式,所以可以定义为常量枚举。

通用枚举类型

在 TypeScript 中,Enum 类型并不只是可以用来定义常量的,还可以作为一种通用的类型来使用。比如我们可以将 Enum 类型作为函数参数的类型,并限定这个参数只能取 Enum 中的常量值,示例代码如下:

-- -------------------- ---- -------
---- ----- -
  ------
  -------
  -----
-

-------- ----------------- ------ -
  ------ ------ -
    ---- ------------
      ------------------ -------
      ------
    ---- -------------
      ------------------- -------
      ------
    ---- ------------
      ------------------ -------
      ------
  -
-

-------------------------- -- -- ------- -----

这里我们定义了一个 displaySize 函数,参数类型是 Sizes,在函数内部根据传入的参数显示不同的尺寸名称。我们可以看到,在函数调用时传入的参数只能是 Enum 中定义的常量。

总结

Enum 是 TypeScript 中一种非常实用的类型,它能够帮助我们更好地管理常量,以及将 Enum 类型作为一种通用类型来使用。掌握 Enum 的使用技巧,可以让我们在开发过程中更加高效和便捷。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fd955095b1f8cacdce6aa2

纠错
反馈