数字枚举
enum Role {
Reporter = 1,
Developer,
Maintainer,
Owner,
Guest
}
console.log(Role.Reporter) // 1
console.log(Role.Developer) // 2
console.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) // 0
console.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
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!