TypeScript - 枚举:初学者的指南

你好,未来的程序员们!今天,我们将一起探索 TypeScript 枚举的奇妙世界。如果你之前从未编写过代码,不用担心——我将像过去几年中无数学生的友好向导一样,带领你开始这段旅程。那么,让我们开始吧!

TypeScript - Enums

什么是枚举?

在我们深入了解枚举的不同类型之前,先来理解一下它们是什么。想象你在整理你的衣橱。你可能有不同的衣服分类:衬衫、裤子、鞋子等。TypeScript 中的枚举就像这些分类——它们帮助我们把相关的值分组并给它们有意义的名称。

数字枚举

数字枚举是 TypeScript 中最常见的枚举类型。它们就像给你的超级英雄分配数字。

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 开始为 Joker 计数,然后它自动为其余的继续计数。

字符串枚举

现在,假设你不喜欢数字,更喜欢单词。这时字符串枚举就派上用场了。它们就像给你的宠物起昵称!

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"

使用字符串枚举时,我们必须给每个成员赋予一个值。就像确保你的每个宠物都知道它们的特殊昵称!

异构枚举

有时,生活不仅仅是数字或字符串——它是两者的混合!异构枚举就像一盒各种口味的巧克力——你得到各种东西。

enum MixedBag {
Number = 1,
String = "STRING",
AnotherNumber = 2
}

console.log(MixedBag.Number);        // 输出: 1
console.log(MixedBag.String);        // 输出: "STRING"
console.log(MixedBag.AnotherNumber); // 输出: 2

虽然这是可能的,但通常建议在一个枚举中要么全部使用数字,要么全部使用字符串,以保持一致性。

运行时的枚举

关于枚举的一个很酷的事情是它们存在于运行时。这意味着你可以在代码中像使用其他任何对象一样使用它们!

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"

在这里,我们像使用普通的 JavaScript 对象一样使用枚举。就像有一个神奇的字典,可以翻译数字到水果名称!

编译时的枚举

枚举在编译时也大放异彩。它们帮助 TypeScript 在代码运行之前捕获错误!

enum DaysOfWeek {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}

let day: DaysOfWeek = DaysOfWeek.Monday;
day = DaysOfWeek.Friday;  // 这没问题

// day = "Monday";  // 错误:类型 '"Monday"' 不能赋给类型 'DaysOfWeek'。

如果你尝试分配一个不属于枚举的值,TypeScript 会给你一个错误。就像在俱乐部门口有一个严格的保镖,只允许星期中的日子进入!

环境枚举

环境枚举有点特殊。它们在你告诉 TypeScript 枚举在其他地方的代码或你使用的库中存在时使用。

declare enum ExternalEnum {
A = 1,
B,
C = 2
}

declare 关键字就像说,“嘿,TypeScript,相信我,这个枚举在代码的其他地方存在。”这在处理不是用 TypeScript 编写的代码时很有用。

对象与枚举

你可能会想,“为什么不直接使用对象?”嗯,枚举有一些优点:

// 使用对象
const ColorObject = {
Red: 'RED',
Green: 'GREEN',
Blue: 'BLUE'
} as const;

// 使用枚举
enum ColorEnum {
Red = 'RED',
Green = 'GREEN',
Blue = 'BLUE'
}

// 使用对象时,你需要使用类型断言
let objColor: keyof typeof ColorObject = 'Red';

// 使用枚举,更直接
let enumColor: ColorEnum = ColorEnum.Red;

枚举提供了更好的类型安全性,并且在许多情况下更加简洁。

使用枚举作为函数参数

枚举非常适合用作函数参数。它们使代码更易读,并防止错误:

enum Sizes {
Small,
Medium,
Large
}

function orderCoffee(size: Sizes): string {
switch(size) {
case Sizes.Small:
return "Here's your small coffee!";
case Sizes.Medium:
return "One medium coffee coming right up!";
case Sizes.Large:
return "Large coffee, extra caffeine!";
default:
return "We don't have that size!";
}
}

console.log(orderCoffee(Sizes.Medium));  // 输出: "One medium coffee coming right up!"
// console.log(orderCoffee("Venti"));    // 错误:参数类型 '"Venti"' 不能赋给参数类型 'Sizes'。

通过使用枚举作为大小参数,我们确保只有有效的尺寸可以被传递给函数。就像有一个带有固定选项的菜单——关于提供哪些尺寸没有混淆!

枚举方法

以下是一些用于处理枚举的有用方法:

方法 描述 示例
Object.keys() 获取枚举的所有键 Object.keys(Sizes)
Object.values() 获取枚举的所有值 Object.values(Sizes)
Object.entries() 获取枚举的所有键值对 Object.entries(Sizes)
Enum[key] 获取键的值 Sizes[Sizes.Small]
Enum[value] 获取值的键(对于数字枚举) Sizes[0]

这些方法帮助你以不同的方式使用枚举,比如获取所有可用的大小或从其值中找到尺寸的名称。

就这样!你已经迈出了进入 TypeScript 枚举世界的第一步。记住,编程就像学习新语言——需要练习,但很快你将熟练掌握枚举语言!继续编码,保持好奇心,别忘了在过程中享受乐趣。谁知道呢,也许你下次会创建一个你最喜欢的冰淇淋口味的枚举!

Credits: Image by storyset