如下枚举定义:
1
2
3
4
5
|
enum Days {
Sun, Mon, Tue, Wend, Thu, Fri, Sat
}
|
会被编译为:
1
2
3
4
5
6
7
8
9
10
11
12
|
var Days;
(function (Days) {
Days[Days["Sun"] = 0] = "Sun";
Days[Days["Mon"] = 1] = "Mon";
Days[Days["Tue"] = 2] = "Tue";
Days[Days["Wed"] = 3] = "Wed";
Days[Days["Thu"] = 4] = "Thu";
Days[Days["Fri"] = 5] = "Fri";
Days[Days["Sat"] = 6] = "Sat";
})(Days || (Days = {}));
|
上面这个写法我大概能猜到什么意思,但是我还没有系统的学习过。先记录下来,以后再研究。
手动赋值
手动赋值有如下知识点:
- 未手动赋值的枚举项会接着上一个枚举项递增
- 如果未手动赋值的枚举项与手动赋值的重复了,TS不会觉察到这一点,且先赋值的会被后赋值的覆盖
- 手动赋值的枚举项可以不是数字,此时需要使用类型断言来让tsc无视类型检查
1
2
3
4
5
6
|
// 此处我是有疑惑的,为什么要断言成any?
enums Days {
Sun = 7, Sat = <any>"S"
}
|
常数项和计算所得项
常数项很好理解,计算所得项需要注意:
- 如果紧接着在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错。
常数枚举
1
2
3
4
5
6
7
8
9
10
|
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
|
常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不会包含计算成员。上面的编译结果为:
1
2
3
|
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
|
加入包含了计算成员,则会在编一阶段报错。
外部枚举
这部分知识,现在还不好理解,暂时不整理了。