枚举
- 键和值的映射,利用键可以得到对应的值,或用值得到对应的键
- 枚举是一种高级变量类型,类似于类,既可以作为接口进行类型声明,同时也进行赋值操作
枚举类型
- 枚举类型指具备枚举特性的一组成员,其成员的值也是其成员的类型
enum ShapeKind {
Circle,
Square,
}
interface Circle {
kind: ShapeKind.Circle;
kind0: typeof ShapeKind.Square;
radius: number;
}
let circle: Circle = {
kind: 0,
kind0: 1,
radius: 10
}
枚举定义方式
手动赋值
enum UserResponse {
No = 0,
Yes = 1,
}
使用默认值
enum UserResponse {
No,
Yes,
}
枚举特性
- 如果设置类型为枚举,则表示该变量只能接收枚举成员,且枚举成员可通过属性查询得到提示
enum UserResponse {
No = 0,
Yes = 1,
}
function respond1(recipient: string, message: UserResponse): void {
}
respond1("Princess Caroline", UserResponse.Yes);
- 枚举类型支持字符串和数字赋值,不支持布尔值以及复杂数据类型
数字枚举
- 成员属性值全是数字型
- 可以用表达式设置。由于枚举有自增特性,如果其中某个成员使用表达式,后面的枚举成员也要使用,否则枚举无法实现自增,报错
function getRandom() {
return Math.random()
}
enum RandomNum {
random0,
random1,
random2 = getRandom()
}
console.log(RandomNum.random0,RandomNum.random1,RandomNum.random2);
字符串枚举
enum StringEnum {
stringAAAAAA: 'A',
stringBBBBBB: 'B',
}
常量枚举
- 仅可在属性、索引访问表达式、导入声明的右侧、导出分配或类型查询中使用
const enum Direction {
up,
down
}
let dir = [Direction.up];
异构枚举
反向映射
- 为某个属性赋属性值,同时将属性值作为属性又赋值其对应的属性名
let infactObj = {} as any;
infactObj[infactObj["a"] = 0] = "a"
枚举和接口的区别
- 枚举既有结构,也有值,自增;接口只有类型结构必须赋于具体变量,并具体赋值
- 枚举可直接作为对象使用,并且能获得成员提示;而接口定义的类型成员需要先具体化才可被具体化的变量调用,且任意属性具体化后无成员提示
enum BookList {
HarryPotter = 1,
TheLordofRing,
OneDay
}
interface ListType0 {
[prop: string]: number
}
let bookList0: ListType0 = {
HarryPotter: 1,
TheLordofRing: 2,
OneDay: 3
}