数字枚举
enum Role {
Reporter = 1,
Developer,
Maintainer,
Owner,
Guest
}console.log(Role.Reporter) // 1console.log(Role.Developer) // 2console.log(Role[2]) // 'Developer'复制代码
默认第一个成员的值为0,后面成员的值依次递增,但是也可以给每个成员赋值一个初始值,可以通过字符串去索引数字,也可以通过数字去索引字符串
字符串枚举
enum Message {
Success = 'success',
Fail = 'fail'}console.log(Message.Success) // 'success'console.log(Message['success']) // undefined复制代码
只能通过Success去索引success,不能反过来用success去索引Success
异构枚举
enum Answer {
N,
Y = 'Yes'}console.log(Answer.N) // 0console.log(Answer.Y) // 'Yes'复制代码
枚举的成员中同时出现数字和字符串,不建议使用
枚举成员
enum Char {// const member(常量枚举成员)a,
b = Char.a,
c = 1 + 3,// computed member(计算枚举成员)d = Math.random(),
e = '123'.length,
f = 4}复制代码
常量枚举成员会在编译阶段计算出结果,然后以常量值的方式出现在运行环境,计算枚举成员不会在编译阶段被计算,会被保留到运行阶段,在运行阶段才会计算出结果。注意:在计算成员后面的枚举成员一定要赋值一个初始值
// ts编译结果"use strict";var Char;
(function (Char) {// const member(常量枚举成员)Char[Char["a"] = 0] = "a";
Char[Char["b"] = 0] = "b";
Char[Char["c"] = 4] = "c";// computed member(计算枚举成员)Char[Char["d"] = Math.random()] = "d";
Char[Char["e"] = '123'.length] = "e";
Char[Char["f"] = 4] = "f";
})(Char || (Char = {}));复制代码
常量枚举
使用const定义的枚举叫常量枚举,特点是代码会在编译后被移除
const enum Month {
Jan,
Feb,
Mar,
Apr = Month.Mar + 1,
}
let month = [Month.Jan, Month.Feb, Month.Mar]复制代码
// 编译后代码"use strict";let month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];复制代码
枚举类型
- 枚举成员没有初始值
- 枚举成员都是数字枚举
- 枚举成员都是字符串枚举
// 枚举成员没有初始值
enum E { a, b }
// 枚举成员都是数字枚举
enum F { a = 0, b = 1 }
// 枚举成员都是字符串枚举
enum G { a = 'apple', b = 'banana' }
// 可以把任意的数字赋值给E和F类型
let e: E = 3
let f: F = 3
e === f // 报错,不同枚举类型不能相互比较
// 变量定义为枚举成员类型
let e1: E.a = 3
let e2: E.b = 3
let e3: E.a = 3
console.log(e1 === e2) // e1和e2是不同的枚举成员类型,会报错
console.log(e1 === e3) // true e1和e3是相同的枚举成员类型,可以比较
// 字符串枚举的取值只能是枚举成员的取值
let g1: G = G.a
let g2: G.a = G.a复制代码