【TS】enum 枚举(含数字枚举转数组方法)

  • 枚举(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",
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值