枚举是一组有名字的常量集合
数字枚举-枚举值会递增,并采用反向映射的原理
enum Role {
Reporter = 2,
Developer,
Maintainer,
Owner,
Guest
}
console.log(Role.Reporter) // 2
console.log(Role[4]) // Maintainer
console.log(Role) // =>
// [2: "Reporter"
// 3: "Developer"
// 4: "Maintainer"
// 5: "Owner"
// 6: "Guest"
// Developer: 3
// Guest: 6
// Maintainer: 4
// Owner: 5
// Reporter: 2]
字符串枚举-编译结果显示只有成员名称作为key,所以它不能进行反向映射的
enum Message {
Success = '成功',
Fail = '失败'
}
异构枚举-数字枚举和字符串枚举混用的结果,容易引起混淆,不建议使用
enum Answer {
N,
Y = 'yes'
}
枚举成员
枚举成员的值是只读类型,定义后不能修改。
1.const member(常量枚举),包括三种情况:没有初始值的情况、对已有枚举成员的引用、常量的表达式,常量枚举成员会在编译的时候计算结果,然后以常量的形式出现在运行时环境。
enum Char {
a,
b = Char.a,
c = 1 + 4
}
2.computed member,指需要被计算的枚举成员,是一些非常量的表达式,这些枚举成员的值不会在编译阶段计算,而是在程序执行阶段计算。
enum Char {
d = Math.random(),
e = '123'.length,
f // 提示错误
}
PS:
特别注意:在computed member后的成员一定要赋给初始值,否则会提示错误
常量枚举
特性:会在编译阶段被移除
作用:当我们不需要一个对象,而需要这个对象的值时,就需要使用常量枚举,这样减少在编译环境的代码
const enum Month {
Jan,
Feb,
Mar
}
let month = [Month.Jan, Month.Feb, Month.Mar]
PS:
会被编译成:
var month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];
枚举类型
在某些情况下,枚举和枚举成员都可以作为一种单独类型存在。
第一种情况,枚举成员没有任何初始值;
第二种情况,所有成员都是数字枚举;
第三种情况,所有成员都是字符串枚举。
enum E { a, b }
enum F { a = 0, b = 1 }
enum G { a = 'apple', b = 'banana' }
对于第一种和第二种情况,可以把任意的number类型赋值给枚举类型,它的取值也可以超出枚举成员的定义,但是两种不同类型的枚举不能进行比较:
let e: E = 3
let f: F = 3
// console.log(e === f) // 提示错误
let e1: E.a = 1
let e2: E.b
// console.log(e1 === e2) // 提示错误
let e3: E.a = 1
console.log(e1 === e3) // true
而第三种情况字符串枚举的取值只能是枚举成员的类型
let g1: G = G.a
let g2: G.a = G.a