个性化阅读
专注于IT技术分析

TypeScript枚举类型用法 – TypeScript开发教程

上一章TypeScript教程请查看:TypeScript三种迭代语句

enum是TypeScript支持的一种新的数据类型。它用于定义一组命名常量,即,相关值的集合,TypeScript支持数字和基于字符串的枚举,我们可以使用enum关键字来定义枚举。

为什么使用枚举类型?

enum在TypeScript中很有用,原因如下:

  • 它使得在未来改变值变得容易。
  • 它减少了由于输入或输入错误而引起的错误。
  • 它只在编译期间存在,因此不分配内存。
  • 使用JavaScript中的内联代码可以节省运行时和编译时。
  • 它允许我们创建与程序相关的常量。
  • 它将使开发人员能够在JavaScript中开发内存效率高的自定义常量,JavaScript不支持枚举,但TypeScript帮助我们访问它们。

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)枚举成员通常被认为是计算枚举。

赞(0)
未经允许不得转载:srcmini » TypeScript枚举类型用法 – TypeScript开发教程

评论 抢沙发

评论前必须登录!