TypeScript 枚举类型

枚举类型由零个或多个枚举成员构成,每个枚举成员都是一个命名的常量。

在TypeScript中,枚举类型是一种原始类型,它通过enum关键字来定义。例如,我们可以使用枚举类型来表示一年四季,示例如下:

enum Season {
   Spring,
   Summer,
   Fall,
   Winter,
}

按照枚举成员的类型可以将枚举类型划分为以下三类:

  • 数值型枚举
  • 字符串枚举
  • 异构型枚举

数值型枚举

数值型枚举是最常用的枚举类型,是number类型的子类型,它由一组命名的数值常量构成。定义数值型枚举的方法如下所示:

enum Direction {
   Up,
   Down,
   Left,
   Right
}

const direction: Direction = Direction.Up;

此例中,我们使用enum关键字定义了枚举类型Direction,它包含了四个枚举成员Up、Down、Left和Right。在使用枚举成员时,可以像访问对象属性一样访问枚举成员。

每个数值型枚举成员都表示一个具体的数字。如果在定义枚举时没有设置枚举成员的值,那么TypeScript将自动计算枚举成员的值。根据TypeScript语言的规则,第一个枚举成员的值为0,其后每个枚举成员的值等于前一个枚举成员的值加1。因此,Direction枚举中Up的值为0、Down的值为1,以此类推。示例如下:

enum Direction {
   Up,      // 0
   Down,    // 1
   Left,    // 2
   Right,   // 3
}

在定义数值型枚举时,可以为一个或多个枚举成员设置初始值。对于未指定初始值的枚举成员,其值为前一个枚举成员的值加1。

示例如下:

enum Direction {
   Up = 1,    // 1
   Down,      // 2
   Left = 10, // 10
   Right,     // 11
}

前文提到,数值型枚举是number类型的子类型,因此允许将数值型枚举类型赋值给number类型。

例如,下例中常量direction为number类型,可以使用数值型枚举Direction来初始化direction常量。示例如下:

enum Direction {
   Up,
   Down,
   Left,
   Right
}

const direction: number = Direction.Up;

需要注意的是,number类型也能够赋值给枚举类型,即使number类型的值不在枚举成员值的列表中也不会产生错误。示例如下:

enum Direction {
   Up,
   Down,
   Left,
   Right,
}

const d1: Direction = 0;  // Direction.Up
const d2: Direction = 10; // 不会产生错误

字符串枚举

字符串枚举与数值型枚举相似。在字符串枚举中,枚举成员的值为字符串。字符串枚举成员必须使用字符串字面量或另一个字符串枚举成员来初始化。字符串枚举成员没有自增长的行为。示例如下:

enum Direction {
   Up = 'UP',
   Down = 'DOWN',
   Left = 'LEFT',
   Right = 'RIGHT',

   U = Up,
   D = Down,
   L = Left,
   R = Right,
}

字符串枚举是string类型的子类型,因此允许将字符串枚举类型赋值给string类型。

例如,下例中常量direction为string类型,可以使用字符串枚举Direction来初始化direction常量:

enum Direction {
   Up = 'UP',
   Down = 'DOWN',
   Left = 'LEFT',
   Right = 'RIGHT',
}

const direction: string = Direction.Up;

但是反过来,不允许将string类型赋值给字符串枚举类型,这一点与数值型枚举是不同的。

例如,下例中将字符串“’UP’”赋值给字符串枚举类型的常量direction将产生编译错误:

enum Direction {
   Up = 'UP',
   Down = 'DOWN',
   Left = 'LEFT',
   Right = 'RIGHT',
}

const direction: Direction = 'UP';
//    ~~~~~~~~~
//    编译错误!类型 'UP' 不能赋值给类型 'Direction'

输出结果:

TypeScript 枚举类型

异构型枚举

TypeScript允许在一个枚举中同时定义数值型枚举成员和字符串枚举成员,我们将这种类型的枚举称作异构型枚举。异构型枚举在实际代码中很少被使用,虽然在语法上允许定义异构型枚举,但是不推荐在代码中使用异构型枚举。我们可以尝试使用对象来代替异构型枚举。

下例中定义了一个简单的异构型枚举:

enum Color {
   Black = 0,
   White = 'White',
}

在定义异构型枚举时,不允许使用计算的值作为枚举成员的初始值。示例如下:

enum Color {
    Black = 0 + 0,
    //      ~~~~~
    //      编译错误!在带有字符串成员的枚举中不允许使用计算值
    White = 'White',
}

在异构型枚举中,必须为紧跟在字符串枚举成员之后的数值型枚举成员指定一个初始值。下例中,ColorA枚举的定义是正确的,但是ColorB枚举的定义是错误的,必须为数值型枚举成员Black指定一个初始值。

示例如下:

enum ColorA {
   Black,
   White = 'White',
}

enum ColorB {
   White = 'White',
   Black,
//  ~~~~~
//  编译错误!枚举成员必须有一个初始值
}

枚举成员映射

不论是哪种类型的枚举,都可以通过枚举成员名去访问枚举成员值。下例中,通过枚举名Bool和枚举成员名False与True能够访问枚举成员的值:

enum Bool {
   False = 0,
   True = 1,
}

Bool.False;   // 0
Bool.True;    // 1

对于数值型枚举,不但可以通过枚举成员名来获取枚举成员值,也可以反过来通过枚举成员值去获取枚举成员名。下例中,通过枚举成员值“Bool.False”能够获取其对应的枚举成员名,即字符串“’False’”:

enum Bool {
   False = 0,
   True = 1,
}

Bool[Bool.False]; // 'False'
Bool[Bool.True];  // 'True'

对于字符串枚举和异构型枚举,则不能够通过枚举成员值去获取枚举成员名。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!