使用枚举我们可以定义一些带名字的常量。也可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。 1. 数字枚举
enum POSITION{
TOP,
RIGHT,
BOTTOM,
LEFT
}
let posT:POSITION = POSITION.TOP
let posR:POSITION = POSITION.RIGHT
let posB:POSITION = POSITION.BOTTOM
let posL:POSITION = POSITION.LEFT
console.log('posT=',posT)// posT = 0
console.log('posR=',posR)// posR = 1
console.log('posB=',posB)// posB = 2
console.log('posL=',posL)// posL = 3
由上可知,默认情况下,TOP 的初始值为 0,其余的成员会从 1 开始自动增长。
以上的枚举示例,在TypeScript Playground中运行, 结果如下:
2.字符串枚举
在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。
enum POSITION{
TOP="TOP",
RIGHT="RIGHT",
BOTTOM="BOTTOM",
LEFT="LEFT"
}
let posT:POSITION = POSITION.TOP
let posR:POSITION = POSITION.RIGHT
let posB:POSITION = POSITION.BOTTOM
let posL:POSITION = POSITION.LEFT
console.log('posT=',posT)// posT = TOP
console.log('posR=',posR)// posR = RIGHT
console.log('posB=',posB)// posB = BOTTOM
console.log('posL=',posL)// posL = LEFT
以上的枚举示例经编译后,对应的 ES5 代码如下:
通过观察数字枚举和字符串枚举的编译结果,我们可以知道数字枚举除了支持 从成员名称到成员值 的普通映射之外,它还支持 从成员值到成员名称 的反向映射,如下所示:
enum POSITION{
TOP,
RIGHT,
BOTTOM,
LEFT
}
let posVal:POSITION = POSITION.TOP
let posName = POSITION[0]
//let posName:POSITION = POSITION[0]//这样写会报错:Type 'string' is not assignable to tye "POSITION"
console.log('posVal=',posVal)//posVal = 0
console.log('posName=',posName)//posName = TOP
3.常量枚举
常量枚举使用关键字const来声明,常量枚举会使用内联语法,不会为枚举类型进行编译且不生成任何js代码。具体示例如下:
const enum POSITION{
TOP,
RIGHT,
BOTTOM,
LEFT
}
let pos:POSITION = POSITION["TOP"]//0
以上的枚举示例经编译后,对应的 ES5 代码如下:
4. 异构枚举
异构枚举的成员是字符串和数字的混合
如下所示:
enum C{
a,
b,
c="c",
d=8
}
以上的枚举示例经编译后,对应的 ES5 代码如下:
注意:不带初始化器的枚举,要么
放在第一的位置,要么被放在使用了数字常量或其他常量初始化了的枚举后面。
function getSomeValue(){
return 123
}
enum C{
a,
A=getSomeValue(),
B
}
这个写法报错:Enum member must have initializer.
因为B前面的不是一个初始化了的变量,而是通过函数返回值的方式
function getSomeValue(){
return 123
}
enum D{
a=getSomeValue(),
A=1,
B
}
console.log(D['a'],D['A'],D['B'])// 123 1 2
这个写法没问题,因为A有初始化器,B跟在A后面。