使用枚举我们可以定义一些带名字的常量。使用枚举也可以很清晰的表达意图或创建出一组有区别的用例
1、数字枚举
2、字符串枚举
在一个字符串枚举里,每个成员都必须使用字符串字面量
3、异构枚举
枚举混合字符串和数字成员
4、计算的和常量成员 (计算的值可以当做常量成员)
每个枚举成员都带有一个值,他可以是常量或计算出来的。当满足如下条件时,枚举成员被当做是常量:
①它是枚举的第一个成员,这种情况下它被赋予值0:
②它不带有初始化器且它之前的枚举成员是一个数字常量。当前的枚举成员的值为它上一个枚举成员的值加1
③枚举成员使用常量枚举表达式初始化。常量枚举表达式是Typescript的子集,他可以在编译阶段求值。
当一个表达式满足下面条件之时,它就是一个常量枚举表达式:
A、一个枚举表达式字面量(主要是字符串字面量或数字字面量)
B、一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
C、带括号的常量枚举表达式
E、一元运算符 + - ~ 其中之一应用在了常量枚举表达式
F、常量枚举表达式作用在二元运算符 + - * % << >> >>> & | ^ 的操作对象。若常数枚举表达式求值后为NaN或Infinity,则会在编译阶段报错
所有其他情况的枚举成员被当做是需要计算得出的值
5、联合枚举与枚举成员的类型
存在一种特殊的非计算的常量枚举成员的子集:字面量枚举成员。字面量枚举成员是指不带有初始值的常量枚举成员,或者是值被初始化为:
①任何字符串字面量(“foo”, "bar", "baz")
②任何数字字面量(1, 100)
③应用了一元 -符号的数字字面量 (-1,-100)
当所有枚举成员都拥有了字面量枚举值时,它就带有一种特殊的语义
首先,枚举成员成为了类型!例如,我们可以说某些成员,只能是枚举成员的值:
另一个变化是枚举类型本身变成了每个枚举成员的联合。虽然我们还没有讨论【联合类型】,但你只要知道通过联合枚举。类型系统能够利用这样一个事实。它可以知道枚举里的值的集合,因为,TypeScript能够捕获在比较值的时候犯的愚蠢的错误
第一个条件X!== G.Foo 已足够判定此if条件的true和false,第二个条件是无效的
6、运行时的枚举
枚举是在运行时真正存在的对象。
7、反向映射
除了创建一个以属性名作为对象成员的对象之外,数字枚举成员还具有了反响映射,从枚举值到枚举名字。例如
8、const枚举
为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问,我们可以使用const枚举,常量枚举通过在枚举上使用const修饰符来定义
常量枚举表达式->值可以直接计算出来
常量枚举不同于常规的枚举,它们会在编译阶段被删除。常量枚举成员在使用的地方会被内联进来,之所以可以这么做是因为,常量枚举不允许包含计算成员,所以成员的值都是已知的
9、外部枚举
外部枚举用来描述已经存在的枚举类型的形状
外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当做常数成员。对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的