枚举
数字枚举
# 使用初始器
enum Direction {
a =1,b,c,d}//a=1,b=2,c=3,d=4
# 不使用初始器
enum Direction {
a,b,c,d}//a=0,b=1,c=2,d=3
初始化器把 a 初始化为 1,其余成员从 1 自动增长
通过枚举的属性访问成员
enum Response {
No = 0, Yes = 1}
function respond(a:string,b: Response):void {
}
respond('str', Respnens.Yes)
通过枚举的名字访问枚举的类型
不带初始化器的枚举可以被被放在第一的位置
或者放置到被初始化成数字常量或其他常量的枚举后面
enum E {
A = getSomeValue()
B,//error
}
字符串枚举
字符串枚举中,每个成员都必须用字符串字面量或另外一个字符串枚举成员进行初始化。
enum Direction {
a = 'up', b = 'down' }
enum Direction {
c = 'up', d }//报错
enum Direction {
c = 'up', d = true }//报错
字符串枚举没有自增长的行为
异构枚举(混合字符串和数字成员)
(heterogeneous enums)枚举混合字符串和数字成员
enum Direction {
No = 0, Yes = 'Yes'}
计算和常量成员
每个枚举成员都有一个值,可以是常量 或 计算出来的
枚举成员被当作常量的情况
- 没有初始化器
- 成员使用 常量枚举表达式初始化。
# 满足下面条件之一,就是一个常量枚举表达式
1. 一个枚举表达式字面量(字符串字面量、数字字面量)
2. 对之前定义的常量枚举成员引用
3.带括号的常量枚举表达式
4.一元运算符 + 、-、~ 应用在 常量上的枚举表达式(-1,+11)
常量枚举表达式初始话,在编译阶段求值。
联合枚举与枚举成员的类型
**字面量枚举成员:**指不带有初始值的常量枚举成员,或者是值被初始化为
- 任何字符串、数字字面量、应用一元运算符的数字字符(-1,-110)
当所有枚举成员都拥有字面量枚举值时,它就带有了一种特殊的语义。
枚举成员成为类型
首先,枚举成员成为了类型,例如:我们可以说某些成员 只能是枚举成员的值
enum ShapeKind {
Circle, Square}
interface Circle {
kind:ShapeKind.Circle}
let c: Circle = {
kind: ShapeKind.Circle}
枚举类型本身变成每个枚举成员的联合。
没懂
运行时的枚举
枚举在运行时真正存在的对象。
enum E {
X,Y,Z}
可作为参数传给函数
function fun(obj: {
X:number} ) {
return obj.X
}
console.log(fun(E))
反应映射
从枚举值得到枚举名
enum E {
X}
const a = E.X //0
const enumName = E[a]//X
不会为字符串枚举成员生成反向映射
const 枚举
为避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问
常量枚举只能使用常量枚举表达式,并且不同常规的枚举,他们在编译阶段会被删除
const enum Enum {
A = 1, B = A * 2}
外部枚举
描述已经存在的枚举类型的形状
declare enum Enum {
A = 1, B, C = 2}
外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。