- 枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。
一、基本用法
枚举的功能类似于字面量类型+联合类型组合的功能,也可以表示一组明确的可选值
- 枚举:定义一组命名常量。它描述一个值,该值可以是这些命名常量中的一个。
// 使用 enum 关键字定义枚举
// 约定枚举名称、枚举中的值以大写字母开头
// 枚举中的多个值之间通过 , (逗号)分隔
enum Direction {
Up,
Down,
Left,
Right,
}
// 定义好枚举后,直接使用枚举名称作为类型注释
// 形参direction的类型为枚举 Direction,那么实参的值应该是枚举 Direction 成员的任意一个。
function changeDirection(direction: Direction){
console.log(direction)
}
// 类似于JS中的对象,枚举直接通过点(.)语法访问枚举的成员。
changeDirection(Direction.Up); // 0
// 我们可以通过枚举的属性来访问枚举成员,和枚举的名字来访问枚举类型
enum Response {
No = 0,
Yes = 1,
}
console.log(Response.No) // 0
console.log(Response.Yes) // 1
二、枚举类型
2.1、数字枚举
数字枚举: 枚举成员的值为数字的枚举
- 枚举成员是有值的,默认为:从0开始自增的数字
// Up使用默认值为 0。 其余的成员会从 0 开始自动增长
enum Direction2 {
Up, // 此时 Direction.Up = 0
Down, // 此时 Direction.Down= 1
Left, // 此时 Direction.Left= 2
Right, // 此时 Direction.Right= 3
}
const arrayValues2 = Object.values(Direction2)
console.log(arrayValues2) // ['Up','Down','Left','Right', 0, 1, 2, 3]
- 数字枚举有自增长的行为,也可以设置他的初始值。
// 设置初始值,Up使用初始化为 1。 其余的成员会从 1 开始自动增长
enum Direction1 {
Up = 1, // 此时 Up = 1
Down, // 此时 Down= 2
Left, // 此时 Left= 3
Right // 此时 Right= 4
}
const arrayValues1 = Object.values(Direction1)
console.log(arrayValues1) // ['Up','Down','Left','Right', 1, 2, 3, 4]
- 取值问题,如果数字
enum
通过Object.values
取值,会把键值对值都取到(字符串枚举没这个问题)
enum values{
Yes = 1, // 此时 values.Yes = 1
No = 0, // 此时 values.No = 0
}
const arrayValues = Object.values(values)
console.log(arrayValues) // ['Yes','No',1,0]
- 然而我们要的是他的value值,他的键值我们是不需要的
// 封装一个数字枚举转数组方法
function enum2arr(valueEnum: any[] | Record<string, any>) {
let values = Array.isArray(valueEnum) ? valueEnum : Object.values(valueEnum);
// 如果 enum 值为 number 类型,ts 生成的 js 对象会同时包含枚举的名称,针对该情形需提出枚举名称
const hasNum = values.some((v) => typeof v === 'number');
if (hasNum) {
values = values.filter((v) => typeof v === 'number');
}
return values;
}
enum values{
Yes = 0, // 此时 values.Yes = 1
No = 1, // 此时 values.No = 2
}
const arrayValues = enum2arr(values)
console.log(arrayValues) // [ 1, 2, ]
2.2、字符串枚举
字符串枚举:枚举成员的值是字符串
- 字符串枚举没有自增长的行为,每个成员必须进行初始化(设置值)!
// 可以用字符串字面量,或另外一个字符串枚举成员进行初始化
enum Direction {
Up = "up", // 此时 Direction.Up = "up"
Down = "down", // 此时 Direction.Down = "down"
Left = "left", // 此时 Direction.Left = "left"
Right = "right", // 此时 Direction.Right = "right"
}
const arrayValues = Object.values(Direction)
console.log(arrayValues) // ['up','down','left','right']
2.3、异构枚举(不推荐)
- 混合字符串和数字成员,但是不建议这样做
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}