TypeScript - Enums:初學者的指南
你好,未來的程式設計師們!今天,我們將要深入 TypeScript Enums 的奇妙世界。如果你從未寫過程式碼,別擔心——我將成為你這次旅程中的友好導遊,就像我過去幾年來為無數學生所做的那樣。那麼,我們開始吧!
Enums 是什麼?
在我們深入了解 Enums 的不同類型之前,讓我們先來了解它們是什麼。想像你正在整理你的衣櫥。你可能會為你的衣服設置不同的分類:襯衫、褲子、鞋子等等。TypeScript 中的 Enums 就像這些分類——它們幫助我們將相關的值組織在一起,並為它們賦予有意義的名稱。
數字 Enums
數字 Enums 是 TypeScript 中最常見的 Enums 類型。它們就像為你喜歡的超級英雄分配數字。
enum Superheroes {
Superman,
Batman,
WonderWoman,
Flash
}
console.log(Superheroes.Superman); // 輸出: 0
console.log(Superheroes.Batman); // 輸出: 1
console.log(Superheroes.WonderWoman); // 輸出: 2
console.log(Superheroes.Flash); // 輸出: 3
在這個例子中,TypeScript 自動從 0 開始分配數字。Superman 獲得 0,Batman 獲得 1,依此类推。這就像它們在排隊拍合照,我們根據它們的位置給它們分配號碼!
但如果我們想從不同的數字開始呢?沒問題!我們也可以做到:
enum Villains {
Joker = 1,
LexLuthor,
Cheetah,
ReverseFlash
}
console.log(Villains.Joker); // 輸出: 1
console.log(Villains.LexLuthor); // 輸出: 2
console.log(Villains.Cheetah); // 輸出: 3
console.log(Villains.ReverseFlash); // 輸出: 4
在這裡,我們告訴 TypeScript 從 1 開始計數,然後它自動為其餘的成員繼續計數。
字符串 Enums
現在,如果你不喜歡數字,而偏好文字,那麼字符串 Enums 會派上用場。它們就像為你的寵物取綽號!
enum PetNames {
Dog = "BUDDY",
Cat = "WHISKERS",
Fish = "BUBBLES",
Bird = "TWEETY"
}
console.log(PetNames.Dog); // 輸出: "BUDDY"
console.log(PetNames.Cat); // 輸出: "WHISKERS"
console.log(PetNames.Fish); // 輸出: "BUBBLES"
console.log(PetNames.Bird); // 輸出: "TWEETY"
使用字符串 Enums 時,我們必須為每個成員賦予一個值。這就像確保你的每個寵物都知道它們的特別綽號!
非均質 Enums
有時候,生活不僅僅是數字或字符串——它是多種東西的混合!非均質 Enums 就像一盒各種巧克力——你會得到一點點所有的東西。
enum MixedBag {
Number = 1,
String = "STRING",
AnotherNumber = 2
}
console.log(MixedBag.Number); // 輸出: 1
console.log(MixedBag.String); // 輸出: "STRING"
console.log(MixedBag.AnotherNumber); // 輸出: 2
雖然這是可能的,但通常建議在 Enum 中只使用全部數字或全部字符串,以保持一致性。
在運行時使用 Enums
關於 Enums 的一個很酷的事情是它們在運行時存在。這意味著你可以像使用任何其他對象一樣在代碼中使用它們!
enum Fruits {
Apple,
Banana,
Orange
}
function getFruitName(fruit: Fruits): string {
return Fruits[fruit];
}
console.log(getFruitName(Fruits.Apple)); // 輸出: "Apple"
console.log(getFruitName(Fruits.Banana)); // 輸出: "Banana"
在這裡,我們將 Enum 用作普通的 JavaScript 對象。這就像擁有一個神奇的字典,可以將數字翻譯成水果名稱!
在編譯時使用 Enums
Enums 在編譯時也表現出色。它們幫助 TypeScript 在代碼甚至還未運行之前就捕獲錯誤!
enum DaysOfWeek {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
let day: DaysOfWeek = DaysOfWeek.Monday;
day = DaysOfWeek.Friday; // 沒問題
// day = "Monday"; // 錯誤:類型 '"Monday"' 不能賦值給類型 'DaysOfWeek'。
如果你嘗試賦予一個不是 Enum 一部分的值,TypeScript 將會給你一個錯誤。這就像在俱樂部有一個嚴格的保鏢,只讓星期中的日子進入!
環境 Enums
環境 Enums 有點特殊。它們在你告訴 TypeScript 它們在代碼的某個地方存在或在你使用的庫中存在時使用。
declare enum ExternalEnum {
A = 1,
B,
C = 2
}
declare
關鍵字就像說,“嘿 TypeScript,相信我,這個 Enum 在代碼的其他地方存在。”當你正在使用不是用 TypeScript 寫的代碼時,這很有用。
對象與 Enums
你可能會想,“為什麼不直接使用對象?”好吧,Enums 有一些優勢:
// 使用對象
const ColorObject = {
Red: 'RED',
Green: 'GREEN',
Blue: 'BLUE'
} as const;
// 使用 Enum
enum ColorEnum {
Red = 'RED',
Green = 'GREEN',
Blue = 'BLUE'
}
// 使用對象時,你需要使用類型斷言
let objColor: keyof typeof ColorObject = 'Red';
// 使用 Enums 時,更直觀
let enumColor: ColorEnum = ColorEnum.Red;
Enums 提供了更好的類型安全,並在許多情況下更簡潔。
使用 Enum 作為函數參數
Enums 非常適合用作函數參數。它們使代碼更具可讀性並防止錯誤:
enum Sizes {
Small,
Medium,
Large
}
function orderCoffee(size: Sizes): string {
switch(size) {
case Sizes.Small:
return "這裡是你的小咖啡!";
case Sizes.Medium:
return "一杯中杯咖啡馬上來!";
case Sizes.Large:
return "大杯咖啡,額外咖啡因!";
default:
return "我們沒有那個尺寸!";
}
}
console.log(orderCoffee(Sizes.Medium)); // 輸出: "一杯中杯咖啡馬上來!"
// console.log(orderCoffee("Venti")); // 錯誤:參數類型 '"Venti"' 不能賦值給類型 'Sizes'。
通過使用 Enum 為尺寸參數,我們確保只有有效的尺寸可以被傳遞給函數。這就像有一個固定的選項菜單——對尺寸的混亂不再存在!
Enum 方法
以下是一些有用的 Enum 方法:
方法 | 描述 | 示例 |
---|---|---|
Object.keys() |
獲取 Enum 的所有鍵 | Object.keys(Sizes) |
Object.values() |
獲取 Enum 的所有值 | Object.values(Sizes) |
Object.entries() |
獲取 Enum 的鍵值對 | Object.entries(Sizes) |
Enum[key] |
獲取鍵的值 | Sizes[Sizes.Small] |
Enum[value] |
獲取值的鍵(對於數字 Enum) | Sizes[0] |
這些方法幫助你以不同的方式使用 Enums,例如獲取所有可用的尺寸或從其值中找到尺寸的名稱。
至此,你已經踏入了 TypeScript Enums 的世界。記住,編程就像學習一門新語言——它需要練習,但很快你將會流利地使用 Enum 語言!持續編碼,保持好奇心,並且在途中不忘享受樂趣。誰知道,也許你會為你喜歡的冰淇淋口味創建一個 Enum 呢!
Credits: Image by storyset