iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
自我挑戰組

TypeScript 能手養成之旅系列 第 10

TypeScript 能手養成之旅 Day 10 物件型別-擴充型別-列舉(Enum)

  • 分享至 

  • twitterImage
  •  

前言

上集我們介紹到 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)。


上一篇
TypeScript 能手養成之旅 Day 9 物件型別-擴充型別-列舉(Enum)
下一篇
TypeScript 能手養成之旅 Day 11 明文型別(Literal Types)
系列文
TypeScript 能手養成之旅16
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言