通过以下语法可以定义新的枚举类型:
enum T { ... }
其中 T
是任意定义的名字,省略号 ...
表示可以定义一个或多个可以显式初始化的枚举值。如:
enum Direction {
Up, // 值默认为 0
Down, // 值默认为 1
Left, // 值默认为 2
Right // 值默认为 3
}
上述语句定义了新的枚举类型关键字 Direction
,现在可以用这个关键字声明新的枚举类型:
// 声明d为枚举类型Direction
let d: Direction;
定义枚举类型的时候就限制了枚举的取值范围,上述定义中枚举类型有4个值 Direction.UP
、Direction.Down
、Direction.Left
、Direction.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;