枚举的优势
定义一些带名字的常量,可以清晰的表达意图
或创建一组有区别的用例
使用枚举
声名
1 | enum Direction { |
访问
- 通过枚举的属性来访问枚举成员
Direction.Up
- 通过枚举的名字来访问枚举类型
let obj:Direction
枚举分类
数字枚举
- 如果初始化为1,其余成员会从1开始自动增长
- 不适用初始化器,默认为从0开始
每个枚举成员的值都是不同的
字符串枚举
- 没有自增长的行为
- 每个成员都必须用字符串字面量,或者另外一个字符串枚举成员进行初始化
可读性好,能表达有用的信息
异构枚举
- 同一个枚举中有多种类型的值
除非你真的想要利用JavaScript运行时的行为,否则不建议这么做
枚举成员分类
常量成员
- 它是枚举的
第一个
成员且没有初始化器
,这种情况下它被赋予值 0 - 它
不带有初始化器
且它之前的枚举成员是一个数字常量
。 这种情况下,当前枚举成员的值为它上一个枚举成员的值加1。 - 枚举成员使用常量枚举表达式初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17enum Cited {
quoteMe
}
enum ConstEnum {
// 一个枚举表达式字面量(主要是字符串字面量或数字字面量)
FIRST = 1,
// 一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
SECOND = Cited.quoteMe,
// 带括号的常量枚举表达式
THIRD = (3),
// 一元运算符 +, -, ~其中之一应用在了常量枚举表达式
FOURTH = +4,
// 常量枚举表达式做为二元运算符 +, -, *, /, %, <<, >>, >>>, &, |, ^的操作对象。
// 若常数枚举表达式求值后为 NaN或 Infinity,则会在编译阶段报错。
FIFTH = 5 / 1
}
计算出来的成员
除了上一章节出现的情况,其他的枚举成员被当作是需要计算得出的值
1 | function computed() { |
字面量枚举成员
指的是哪些成员
- 不带有初始值的常量枚举成员
- 被初始化为
- 任何字符串
- 任何数字
- 应用了医院符号
-
的数字字面量
有什么特殊的地方
当所有
枚举成员都拥有字面量枚举值时
枚举成员成为了类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20enum ShapeKind {
Circle,
Square,
}
interface Circle {
kind: ShapeKind.Circle;
radius: number;
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapeKind.Square,
// ~~~~~~~~~~~~~~~~ Error!
radius: 100,
}枚举类型本身变成了每个枚举成员的联合
1
2
3
4
5
6
7
8
9
10
11enum E {
Foo,
Bar,
}
function f(x: E) {
if (x !== E.Foo || x !== E.Bar) {
// ~~~~~~~~~~~
// Error! Operator '!==' cannot be applied to types 'E.Foo' and 'E.Bar'.
}
}
反向映射
枚举名->枚举值
枚举值->枚举名
1
2
3
4enum Enum {
A
}
let a = Enum.A;