阅读 111

enum

枚举:类似于js中的object,但是支持反向映射

enum Data {
    enumdata1: 23
}
Data.enumdata1=23; Data[23]=enumdata1
//js:
var Data={};
Data[Data['enumdata1'] = 23] = 'enumdata1';
复制代码

支持numberstring枚举,默认情况下初始值从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 = {}));
复制代码
文章分类
前端
文章标签