枚举类型
简介
使用枚举可以清晰地表达意图或创建一组有区别的用例。
typescript
enum Direction {
Up,
Down,
Left,
Right,
}
let dir1: Direction = Direction.Up // 0
let dir2: Direction = Direction['Down'] // 1
Enum
结构的特别之处在于,它既是一种类型,也是一个值。 Enum
结构在编译后会变成 JavaScript 对象,因此上述可以使用对象的方式访问枚举值(.
和[]
)。
TypeScript支持数字的和基于字符串的枚举。
数字枚举
如果没有指定枚举值,默认为数字枚举,它是一个从0开始递增的数字序列。
typescript
enum Direction {
Up,
Down,
Left,
Right,
}
// 等价于 =>
enum Direction {
Up = 0,
Down = 1,
Left = 2,
Right = 3,
}
可以通过赋值来改变默认的数字序列。
typescript
enum Direction {
Up = 1,
Down,
Left,
Right,
}
// 等价于 =>
enum Direction {
Up = 1,
Down = 2,
Left = 3,
Right = 4,
}
字符串枚举
字符串枚举是一种用字符串值初始化的枚举。
typescript
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
异构枚举
异构枚举是数字枚举和字符串枚举的混合。(虽然符合TS语法,但不建议这么做)
异构枚举有一个特殊的行为,任何字符串枚举项之后的所有成员都必须显式赋值,因为打断了TS的默认递增规则):
typescript
enum Color {
Red, // 0
Yellow, // 1
Green = 'GREEN', // 打断了TS的递增规则
Blue = 9, // 此时必须显式赋值
White, // 10
}
枚举的合并
(同名)枚举可以合并,合并后的枚举会包含所有枚举的属性。
typescript
enum Direction {
Up = 'UP',
Down = 'DOWN',
}
enum Direction {
Left = 'LEFT',
Right = 'RIGHT',
}
// 此时的Direction等价于:
// enum Direction {
// Up = 'UP',
// Down = 'DOWN',
// Left = 'LEFT',
// Right = 'RIGHT',
// }
但是枚举合并有以下几种限制:
- 只允许其中一个的首成员省略初始值
- 不能有同名成员
- 所有定义必须同为 const 枚举或者非 const 枚举,不允许混合使用。
由于这些限制,实际开发中不推荐枚举合并,而且会导致代码可读性变差。
keyof获取枚举键
keyof 运算符可以取出 Enum 结构的所有成员名,作为联合类型返回。
typescript
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
type DirectionKeys = keyof typeof Direction // 'Up' | 'Down' | 'Left' | 'Right'
反向映射
枚举类型的值可以通过枚举的键来获取,这种映射关系是双向的。
typescript
enum Direction {
Up,
Down,
Left,
Right,
}
console.log(Direction[2]) // 'Left'