typescript之枚举

633 阅读2分钟

使用枚举我们可以定义一些带名字的常量。也可以清晰地表达意图或创建一组有区别的用例。 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中运行, 结果如下:

830-1.png 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 代码如下:

830-1.png 通过观察数字枚举和字符串枚举的编译结果,我们可以知道数字枚举除了支持 从成员名称到成员值 的普通映射之外,它还支持 从成员值到成员名称 的反向映射,如下所示:

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 代码如下:

830-1.png

4. 异构枚举
异构枚举的成员是字符串和数字的混合
如下所示:

enum C{
    a,
    b,
    c="c",
    d=8
}

以上的枚举示例经编译后,对应的 ES5 代码如下:

830-1.png 注意:不带初始化器的枚举,要么放在第一的位置,要么被放在使用了数字常量或其他常量初始化了的枚举后面。

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后面。

参考链接:
# 一份不可多得的 TS 学习指南(1.8W字)
# 一篇够用的TypeScript总结