上一章TypeScript教程请查看:TypeScript三种迭代语句
enum是TypeScript支持的一种新的数据类型。它用于定义一组命名常量,即,相关值的集合,TypeScript支持数字和基于字符串的枚举,我们可以使用enum关键字来定义枚举。
为什么使用枚举类型?
enum在TypeScript中很有用,原因如下:
- 它使得在未来改变值变得容易。
- 它减少了由于输入或输入错误而引起的错误。
- 它只在编译期间存在,因此不分配内存。
- 使用JavaScript中的内联代码可以节省运行时和编译时。
- 它允许我们创建与程序相关的常量。
- 它将使开发人员能够在JavaScript中开发内存效率高的自定义常量,JavaScript不支持枚举,但TypeScript帮助我们访问它们。
TypeScript中有三种类型的枚举。这些都是:
- 数字枚举
- 字符串枚举
- 异构的枚举
数字枚举
数字枚举是基于数字的枚举,它将值存储为数字。这意味着我们可以将数字分配给枚举的实例。
例子
enum Direction {
Up = 1,
Down,
Left,
Right,
}
console.log(Direction);
在这里,我们用1初始化,然后从该点开始自动递增所有下面的成员。这意味着方向。Up是1,Down是2,Left是3,Right是4。
我们可以声明enum而不需要初始化,如下所示。
enum Direction {
Up,
Down,
Left,
Right,
}
console.log(Direction);
在这里,Up的值为0,并且所有下面的成员都从该点开始自动递增。这意味着方向。上面是0,下面是1,左边是2,右边是3。当不需要关心成员值本身时,自动递增行为非常有用。但是每个值必须与同一枚举中的其他值不同。
我们可以向enum成员提供任何值,如下面的示例所示。
例子
enum Direction {
Up=1,
Down=3,
Left=6,
Right=10,
}
console.log(Direction);
Enum作为函数参数
我们还可以使用enum作为函数类型或返回类型,如下面的示例所示。
enum AppStatus {
ACTIVE,
INACTIVE,
ONHOLD
}
function checkStatus(status: AppStatus): void {
console.log(status);
}
checkStatus(AppStatus.ONHOLD);
在上面的例子中,我们已经声明了enum AppStatus。接下来,我们创建一个函数checkStatus(),它接受一个返回enum AppStatus的输入参数status。在函数中,我们检查状态的类型。如果状态名匹配,则获得匹配的enum成员。
在这里,我们可以看到,在最后一条语句中输出的值“2”在大多数场景中没有多大用处。这就是推荐使用基于字符串的枚举的原因。
字符串枚举
字符串枚举是与数字枚举类似的概念,除了枚举有一些细微的运行时差异。在字符串enum中,每个enum值都是用字符串文字或另一个字符串enum成员(而不是数值)常量初始化的。
字符串枚举没有自动递增行为。使用这个枚举的好处是字符串枚举提供了更好的可读性。如果我们正在调试一个程序,字符串枚举允许我们在代码运行时给出一个有意义的、可读的值,而不依赖于枚举成员本身的名称。
考虑下面的数字枚举示例,但它是用字符串枚举表示的:
例子
enum AppStatus {
ACTIVE = 'ACT',
INACTIVE = 'INACT',
ONHOLD = 'HLD',
ONSTOP = 'STOP'
}
function checkStatus(status: AppStatus): void {
console.log(status);
}
checkStatus(AppStatus.ONSTOP);
在上面的示例中,我们声明了一个字符串enum AppStatus,其值与上面的数字enum相同。但是字符串枚举不同于数字枚举,后者的字符串枚举值是用字符串文本初始化的。这些枚举之间的区别在于数值枚举值是自动递增的,而字符串枚举值需要单独初始化。
异构的枚举
异构枚举是同时包含字符串和数值的枚举。但是建议你不要这样做,除非需要利用JavaScript运行时行为。
例子
enum AppStatus {
ACTIVE = 'Yes',
INACTIVE = 1,
ONHOLD = 2,
ONSTOP = 'STOP'
}
console.log(AppStatus.ACTIVE);
console.log(AppStatus.ONHOLD);
计算成员和常数成员
我们知道每个enum成员都有一个与其关联的值,这些值可以是常量,也可以是计算值。如果:
1、它是enum的第一个成员,没有初始化值。在本例中,它被赋值为0。
例子
// Name.Hola is constant:
enum Name {
Hola
}
console.log(Name);
2、它没有初始化值,前面的enum成员是一个数值常量。在本例中,当前enum成员的值将是前一个enum成员的值加上1。
// 所有成员都是常量
enum Name {
AA,
BB,
CC
}
enum Profile {
Engineer=1,
Leader,
Businessman
}
在TypeScript中,我们可以说一个表达式是常量enum表达式,如果它是:
- 一个字面量enum表达式。
- 对前面定义的常量enum成员的引用。
- 括号中的常数枚举表达式。
- 它是用于常量enum表达式的+、-、~一元运算符之一。
- +, -, *, /, %, <<, >>, >>>, &, |, ^操作数为常数枚举表达式的二进制操作符。
在所有其他情况下,enum成员都被认为是经过计算的。下面的枚举示例包括具有计算值的枚举成员。
enum Weekend {
Friday = 1,
Saturday = getDate('Oreja'),
Sunday = Saturday * 40
}
function getDate(day : string): number {
if (day === 'Oreja') {
return 3;
}
}
console.log(Weekend.Saturday);
console.log(Weekend.Sunday);
反向映射
TypeScript enums也支持反向映射。这意味着我们可以访问enum成员的值,也可以从其值访问成员名。我们可以从下面的例子中理解反向映射。
注意:字符串enum不支持反向映射。
例子
enum Weekend {
Friday = 1,
Saturday,
Sunday
}
console.log(Weekend.Saturday);
console.log(Weekend["Saturday"]);
console.log(Weekend[3]);
枚举运行时
枚举是运行时存在的实际对象。我们可以从下面的例子中理解它
enum E {
A, B, C
}
它实际上可以传递给函数,我们可以在下面的示例中看到。
function f(obj: { A: number }) {
return obj.A;
}
f(E);
环境枚举
我们可以使用环境枚举来描述已经存在的枚举类型的状态。
Declare enum Enum{
X=1,
Y,
Z=2
}
主要有一个区别,在环境和非环境的枚举。在常规枚举中,如果前面的枚举成员被认为是常量,那么没有初始化器的成员就被认为是常量。但是,没有初始化器的环境(和non-const)枚举成员通常被认为是计算枚举。
评论前必须登录!
注册