TS中的枚举

如下枚举定义:

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 = {}));

上面这个写法我大概能猜到什么意思,但是我还没有系统的学习过。先记录下来,以后再研究。

手动赋值

手动赋值有如下知识点:

  1. 未手动赋值的枚举项会接着上一个枚举项递增
  2. 如果未手动赋值的枚举项与手动赋值的重复了,TS不会觉察到这一点,且先赋值的会被后赋值的覆盖
  3. 手动赋值的枚举项可以不是数字,此时需要使用类型断言来让tsc无视类型检查
1
2
3
4
5
6

// 此处我是有疑惑的,为什么要断言成any?
enums Days {
    Sun = 7, Sat = <any>"S"
}

常数项和计算所得项

常数项很好理解,计算所得项需要注意:

  1. 如果紧接着在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错。

常数枚举

 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 */];

加入包含了计算成员,则会在编一阶段报错。

外部枚举

这部分知识,现在还不好理解,暂时不整理了。