Typescript中的枚举(enum)可以参考C#中的枚举(enum)类型,毕竟都是微软开发的语言。

枚举这个数据类型在原生javascript中是没有的。在编译成js之后其实就是一个键值对形式存储的对象。

像官网介绍的,枚举是对 js 标准数据类型的补充,声明一组带名字的常量;

一:数字枚举

数字枚举,声明了一个枚举成员均不带初始化器的枚举,

该枚举的成员值从 0 开始,依次递增(+1)

// 定义一个数字枚举
enum enumConst{
    up = 1,
    down,
    left = 10,
    right
};
 
console.log(enumConst[1]);
console.log(enumConst[2]);
console.log(enumConst[3]);
console.log(enumConst[4]);
console.log(enumConst[44]);
// 输出:
// up
// down
// left
// right
// undefined
 
console.log(enumConst.up);
console.log(enumConst.down);
console.log(enumConst.left);
console.log(enumConst.right);
// 输出:
// 1
// 2
// 10
// 11

数字枚举经过编译之后会生成 lookup table (反向映射表),即除了生成键值对的集合,还会生成值键对的集合。

二:字符串枚举

字符串枚举需使用字符串字面量或者之前定义的字符串枚举成员来初始化

// 定义一个字符串枚举
enum enumString{
    up = 'UP',
    down = 'DOWN',
    left ='LEFT',
    right = 'RIGHT'
};
console.log(enumString.up);
console.log(enumString.down);
console.log(enumString['left']);
console.log(enumString['right']);
console.log(enumString['ffffffff']);
// 输出:
// UP
// DOWN
// LEFT
// RIGHT
// undefined

字符串枚举不会生成反向映射

三:异构枚举

异构枚举就一个枚举中既有数字,也有字符串。可以这么写,但是不推荐这么做。

enum hunho{
    up = 1,
    down = 2,
    left ='LEFT',
    right = 'RIGHT'
}
console.log(hunho.up);
console.log(hunho.down);
console.log(hunho['left']);
console.log(hunho['right']);
// 输出:
// 1
// 2
// LEFT
// RIGHT

四:const枚举

大多数情况下,枚举是十分有效的方案。 然而在某些情况下需求很严格。 为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问,我们可以使用 const枚举。 常量枚举通过在枚举上使用 const修饰符来定义。

const enum Enum {
    A = 1,
    B = A * 2
}

常量枚举只能使用常量枚举表达式,并且不同于常规的枚举,它们在编译阶段会被删除。 常量枚举成员在使用的地方会被内联进来。 之所以可以这么做是因为,常量枚举不允许包含计算成员。

const enum Directions {
    Up,
    Down,
    Left,
    Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
生成后的代码为:

var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

五:外部枚举

外部枚举用来描述已经存在的枚举类型的形状。

说人话就是:

外部枚举是为了描述当前环境中已经存在的对象的,这个对象可以存在任意的地方,但是一定是已声明的;

declare enum enumConst {
    A = 1,
    B,
    C = 2
}

外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。

有好的建议,请在下方输入你的评论。