TypeScript 能手养成之旅 Day 10 物件型别-扩充型别-列举(Enum)

前言

上集我们介绍到 Enum 基础用法,今天将来讲解其它用法。

字串列举(String enum)

字串 enum 其实和它字面上的意思一样,简单来说就是以字串来赋值。

enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT",
}

console.log(Direction["Up"]) // UP
console.log(Direction["UP"]) // 喷错

要注意的有两点:

  1. 如果没有赋值,会喷错。
enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT",
  Cy
}

  1. 字串 enum 没有反向映射。

温馨小提醒:如果两个元素拥有相同的值,TypeScript 是不会喷错的。

异构列举(Heterogeneous enum)

有时候同一个 enum 里面,可能需要不只是一种 type,这样是可行的吗? 答案是肯定的,所以这里我们要来介绍 Heterogeneous enum,这就是复合式的 enum

enum Somethings {
  Cy = "engineer",
  Age = 28,
  gender,
}

console.log(Somethings["Cy"]) // engineer
console.log(Somethings[28]) // Age
console.log(Somethings["gender"]) // 29

温馨小提醒:虽然可以这样,但我们可以思考一下为什麽官方会建议慎用。

常数列举(const enum)

接下来,如果我们希望元素都可以是常数,我们可以使用 const enum ,看到名字大概可以猜得出来,我们是要用 const 来定义。

常数列举和普通列举不一样的地方:

常数列举

const enum Fruit {
  Apple = 0,
  Banana = 1,
  Orange = 2,
  Grape = 3
}

let fruit = [
  Fruit.Apple,
  Fruit.Banana,
  Fruit.Orange,
  Fruit.Grape
];

编译後

var snacks = [
    0 /* Apple */,
    1 /* Banana */,
    2 /* Orange */,
    3 /* Other */
];

普通列举

enum Fruit {
  Apple = 0,
  Banana = 1,
  Orange = 2,
  Grape = 3
}

let fruit = [
  Fruit.Apple,
  Fruit.Banana,
  Fruit.Orange,
  Fruit.Grape
];

编译後

var Fruit;
(function (Fruit) {
    Fruit[Fruit["Apple"] = 0] = "Apple";
    Fruit[Fruit["Banana"] = 1] = "Banana";
    Fruit[Fruit["Orange"] = 2] = "Orange";
    Fruit[Fruit["Grape"] = 3] = "Grape";
})(Fruit || (Fruit = {}));
var fruit = [
    Fruit.Apple,
    Fruit.Banana,
    Fruit.Orange,
    Fruit.Grape
];

有什麽差异呢?

  1. 使用 const 定义的时候不会产生 Object,也就不会有 IIFE 的产生,因此效能上会更好点。
  2. 编译後结构上会相较普通列举单纯,可以直接使用,不用再找相对应的值。

外部列举(Ambient enum)

外部列举是使用 declare enum 来定义。

declare enum Directions {
    Up,
    Down,
    Left,
    Right
}

let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];

经过编译後,会消失。

var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];

结语

这两天和大家一起来认识了 enum,不知道大家有想要开始使用 enum 来让自己的程序码更加坚固安全了吗?
明天将和大家一起来看 明文型别 (Literal Types)。


<<:  懂得市场定位,就能立足市场—南北杂货的经营智慧

>>:  Day27 - 在 Kubernetes Ingress 挂上 Google SSL 凭证

Day 08 - 网站大流量也不卡? Elastic Load Balancer (ELB) & Auto Scaling

不知道大家有没有经历过网站卡卡的情况,尤其是抢车票或抢预约疫苗的时候,网站总是因为流量大,而瞬间卡住...

[Day12] placeholder for test day 18

写在前面 placeholder for test day 18 placeholder for t...

Day18 - 【概念篇】OAuth flows: PKCE

本系列文之後也会置於个人网站 +-------------------+ | Authz Serv...

.NET Core第26天_ScriptTagHelper的使用

ScriptTagHelper (脚本标签帮助程序):是针对HTML原生<script> tag的...

[想试试看JavaScript ] 函式

函式 (Function) 函式也称做函数。 函式可以将一行或多行程序码指令包装起来,当我需要使用这...