Skip to content

Latest commit

 

History

History
122 lines (94 loc) · 3.13 KB

枚举类型.md

File metadata and controls

122 lines (94 loc) · 3.13 KB

枚举类型

通过以下语法可以定义新的枚举类型:

enum T { ... }

其中 T 是任意定义的名字,省略号 ... 表示可以定义一个或多个可以显式初始化的枚举值。如:

enum Direction {
  Up,   // 值默认为 0
  Down, // 值默认为 1
  Left, // 值默认为 2
  Right // 值默认为 3
}

上述语句定义了新的枚举类型关键字 Direction,现在可以用这个关键字声明新的枚举类型:

// 声明d为枚举类型Direction
let d: Direction;

定义枚举类型的时候就限制了枚举的取值范围,上述定义中枚举类型有4个值 Direction.UPDirection.DownDirection.LeftDirection.Right,枚举类型在任一时刻只能取这4个值其中之一

// 声明并初始化
let d: Direction = Direction.Down;
// 改变枚举类型的值
d = Direction.Up;

枚举值的默认值和自增性

如果没有对枚举值显式初始化,那么枚举值默认为数字类型,第一个出场的元素默认为数字 0,后续未显式初始化的枚举值会在前一个数字值的基础上自动 +1。根据规则,可以得出前面的枚举定义中:

Direction.Up === 0;
Direction.Down === 1;
Direction.Left === 2;
Direction.Right === 3;

如果我们为枚举定义显式添加数字默认值

enum Direction {
  Up = 2,
  Down,
  Left = 3.3,
  Right
}

则得出:

Direction.Up === 2;       // 显式初始化
Direction.Down === 3;     // 2 + 1 = 3
Direction.Left === 3.3;   // 显式初始化
Direction.Right === 4.3;  // 3.3 + 1 = 4.3

在上述场景中,枚举值实际上就是数字类型 number,此时可以将枚举值直接赋值给数字:

let n: number  = Direction.Right; // 合法

作为字符串的枚举值

除了初始化为数字,还可以将枚举值显式初始化为字符串:

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

// 正确
Direction.Up === 'UP'; 
Direction.Down === 'DOWN';     
Direction.Left === 'LEFT';  
Direction.Right === 'RIGHT'; 

// 枚举值是字符串,直接赋值给字符串类型
let s: string = Direction.Up;  

在初始化为字符串的场景中,值的数字自增性依然起作用。如果一个没有显式初始化的枚举值前面是一个字符串,将会报错:

enum Direction {
  Up = 'UP',
  Down, // error TS1061: Enum member must have initializer
  Left, // error TS1061: Enum member must have initializer
  Right // error TS1061: Enum member must have initializer
}

虽然枚举值 Direction.Down 没有显式初始化,但自增引擎仍然会起作用:编译器检测到前面一个出场的值 Direction.Up 为字符串类型,无法自增 +1,此时编译器报错。改正这个错误很简单:

enum Direction {
  Up = 'UP',
  Down = 3,
  Left, // 不会报错,值为 3+1=4
  Right // 不会报错,值为 4+1=5
}

// 正确
Direction.Up === 'UP'; 
Direction.Down === 3;     
Direction.Left === 4;  
Direction.Right === 5;