TypeScript - 枚举:初学者的指南
你好,未来的程序员们!今天,我们将一起探索 TypeScript 枚举的奇妙世界。如果你之前从未编写过代码,不用担心——我将像过去几年中无数学生的友好向导一样,带领你开始这段旅程。那么,让我们开始吧!
什么是枚举?
在我们深入了解枚举的不同类型之前,先来理解一下它们是什么。想象你在整理你的衣橱。你可能有不同的衣服分类:衬衫、裤子、鞋子等。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