Skip to main content

枚举

数字枚举

e.g. 红绿蓝 Red = 0,Green = 1,Blue = 2

// 默认从 0 开始,并递增
enum Color {
red,
green,
blue
}
console.log(Color.red) // 0
console.log(Color.green) // 1
console.log(Color.blue) // 2

增长枚举

// 起始是 2,其余递增
enum Color {
red = 2,
green,
blue
}
console.log(Color.red) // 2
console.log(Color.green) // 3
console.log(Color.blue) // 4

定义枚举

enum Color {
red = 2,
green = 4,
blue = 6
}
console.log(Color.red) // 2
console.log(Color.green) // 4
console.log(Color.blue) // 6

字符串枚举

enum Color {
red = 'red',
green, // 报错 枚举成员必须具有初始化表达式
blue = 'blue'
}
console.log(Color.red)
console.log(Color.green)
console.log(Color.blue)

异构枚举

枚举可以混合类型

enum Flag {
yes = 1,
no = 'no'
}

接口枚举

enum Color {
red = 'red',
green = 'green',
blue = 'blue'
}

interface A {
red: Color.red
}

const obj: A = {
red: Color.red
}

const 枚举

不能包含计算成员

const enum Person {
name = 'Olu',
age = 18,
aa = 'qwe'.length // 报错 含字符串值成员的枚举中不允许使用计算值
}

let otherName: string = 'Olu'

if (otherName === Person.name) {
console.log('aha')
}

使用 const 声明枚举编译得到的 js 如下

var otherName = 'Olu';
if (otherName === "Olu" /* Person.name */) {
console.log('aha');
}

可以看出使用 const 声明枚举时,枚举被编译成了常量

enum Person {
name = 'Olu',
age = 18
}

let otherName: string = 'Olu'

if (otherName === Person.name) {
console.log('aha')
}

不使用 const 声明枚举编译得到的 js 如下

var Person;
(function (Person) {
Person["name"] = "Olu";
Person[Person["age"] = 18] = "age";
})(Person || (Person = {}));
var otherName = 'Olu';
if (otherName === Person.name) {
console.log('aha');
}

可以看出不使用 const 声明枚举时,枚举被编译成了对象

反向映射

包含正向映射(name => value)和反向映射(value => name)

string 类型不可以进行反向映射

enum Person {
name
}

let username = Person.name
console.log(username) // 0
let item = Person[username]
console.log(item) // name

编译结果如下:

var Person;
(function (Person) {
Person[Person["name"] = 0] = "name";
})(Person || (Person = {}));
var username = Person.name;
console.log(username);
var item = Person[username];
console.log(item);