枚举:类似于js中的object,但是支持反向映射
enum Data {
enumdata1: 23
}
Data.enumdata1=23; Data[23]=enumdata1
//js:
var Data={};
Data[Data['enumdata1'] = 23] = 'enumdata1';
支持number和string枚举,默认情况下初始值从0开始。
number枚举
enum Eg {
a,
b
}
Eg[a] // 0
Eg[b] // 1
number枚举在定义值的时候支持使用计算值,但其之后的字段必须设置初始值
enum Roles {
kangkang,
jean,
marrai = (() => { return 23 })(),
sener, //TS1061: Enum member must have initializer.
marra = (() => { return '23' })(), //TS18033: Only numeric enums can have computed members, but this expression has type 'string'. If you do not need exhaustiveness checks, consider using an object literal instead
}
console.log('Roles[1]: ', Roles[1]); //jean
string枚举值要求每个字段的值都必须是字符串字面量,或者是该枚举值中另一个字符串枚举成员
enum Eg {
a = 'hahahaha',
b = a
}
Eg[a] // hahahaha
Eg[b] // hahahaha
枚举成员类型和联合枚举类型
如果枚举值里所有成员的值都是字面量类型的值,那么这个枚举的每个成员和枚举值本身都可以作为类型来使用即:
1、不带初始值的枚举 2、值为字符串字面量 3、值为数值字面量或者带-的数值字面量
enum Animal {
Dog = 1,
Cat = 2
}
interface Dog {
type: Animal.Dog; // 这里使用Animal.Dog作为类型,指定接口Dog的必须有一个type字段,且类型为Animal.Dog
}
interface Cat {
type: Animal.Cat; // 这里同上
}
let cat1: Cat = {
type: Animal.Dog // error [ts] 不能将类型“Animal.Dog”分配给类型“Animal.Cat”
};
let dog: Dog = {
type: Animal.Dog
};
联合枚举类型
enum Status {
Off,
On
}
interface Light {
status: Status;
}
enum Animal {
Dog = 1,
Cat = 2
}
const light1: Light = {
status: Animal.Dog // error 不能将类型“Animal.Dog”分配给类型“Status”
};
const light2: Light = {
status: Status.Off
};
const light3: Light = {
status: Status.On
};
其中light的status 字段的类型为枚举值 Status,那么此时 status 的属性值必须为 Status.Off 和 Status.On 中的一个,也就是相当于status: Status.Off | Status.On。
运行时的枚举
一般情况下,ts转换成js时会‘翻译’一遍enum,在enum之前使用const则不会翻译而是在使用的地方直接传值(但是const时只能使用字面量类型的值且无法反向映射)
enum Roles { kangkang, jean, marrai = (() => { return 23 })()}
//to js
(function (Roles) { Roles[Roles["kangkang"] = 0] = "kangkang"; Roles[Roles["jean"] = 1] = "jean"; Roles[Roles["marrai"] = (function () { return 23; })()] = "marrai"})(Roles || (Roles = {}));