学习typescript6(枚举类型)

enum类型是对JavaScript标准数据类型的一个补充。枚举是一种特殊的对象,其成员是有名字的常量。这些值可以是数字或字符串。

默认情况下,从0开始为元素编码,也可以手动指定成员的数值

enum Color{Red,Green,Blue}
let c:Color=Color.Green

//手动指定成员的数值
enum Color{Red=1,Green,Blue}
enum Color{Red=1,Green=2,Blue=4}

1.数字枚举

enum Direction{
	Up,
	Down,
	Left,
	Right
}

增长枚举

定义了一个数字枚举, Up使用初始化为 1。 其余的成员会从 1开始自动增长。

enum Direction{
	Up=1,
	Down,// 自动增长,此处为2
	Left,// 自动增长,此处为3
	Right// 自动增长,此处为4
}

字符串枚举

enum Direction{
	Up="UP",
	Down="DOWN",
	Left="LEFT",
	Right="RIGHT"
}

异构枚举

枚举可以混合字符串和数字成员,除非你真的想要利用JavaScript运行时的行为,否则我们不建议这样做。

enum Direction{
	No=0,
	Yes='YES'
}

计算成员和常量成员

每个枚举成员都有一个与之关联的值,可以是常量或计算值。在以下情况下,枚举成员被认为是常量:

1)它是枚举中第一个成员,并且没有初始化器,这种情况下它被赋予值0

//E.X is constant
enum E{
	X
}

2)它没有初始化程序,并且前面的枚举成员是一个数字常量,在这种情况下,当前枚举成员的值将是前一个枚举成员的值加一

//All enum members in 'E1' and 'E2' are constant.
enum E1{
	X,
	Y,
	Z
}
enum E2{
	A=1,
	B,
	C
}

3)枚举成员使用 常量枚举表达式进行初始化。常量枚举表达式是TypeScript表达式的自己,它可以在编译阶段求值。当一个表达式满足小面条件之一时,它就是一个常量枚举表达式:

  • 一枚举表达式字面量(主要是字符串字面量或数字字面量)
  • 一个对之前定义的常量枚举成员的引用
  • 带括号的常量表达式
  • 一元运算符+ ,- ,~ 其中之一应用在了常量枚举表达式
  • 常量枚举表达式作为二元运算符+, -, *, /, %, <<, >>, >>>, &, |, ^的操作对象。若常数枚举表达式求值后为 NaNInfinity,则会在编译阶段报错。
enum FileAccess{
	//constant members
	None,
	Read = 1 << 1,
	Write = 1 << 2,
	ReadWrite =Read | Write,
	//computed member
	G = "123".length
}

接口枚举

定义一个枚举Types,定义一个接口A,他有一个属性red值为Types.yyds

enum Types{
	yyds,
	dddd
}
interface A{
	red:Types.yyds
}
let obj:A={
	red:Types.yyds
}

联合枚举

enum E{
	Foo,
	Bar
}
functin f(x:E){
	if(x!==E.Foo ||x!==E.Bar){
	// This condition will always return 'true' since the types 'E.Foo' and 'E.Bar' have no overlap.
	}
}

运行时的枚举

枚举是运行时存在的真实对象

enum E{
	X,
	Y,
	Z
}
function f(obj:{X:number}){
	return obj.X
}
//有效,因为“E”有一个名为“X”的属性,它是一个数字。
f(E)

编译时的枚举

使用keyof typeof获取将所有Enum键表示为字符串的类型

enum LogLevel{
	ERROR,
	WARN,
	INFO,
	DEBUG
}
/**
*这相当于:
*type LogLevelStrings='ERROR'|'WARN'|'INFO'|'DEBUG';
*/
type LogLevelStrings= keyof typefo LogLevel;
function printImportant(key:LogLevelStrings,messag:string){
	const num=LogLevel[key]
	if(num<LogLevel.WARN){
		console.log("Log level key is:",key)
		console.log("Log level value is:",num)
		console.log("Log level message is:" message)
	}
}
printImportant("ERROR","This is a message")

const枚举

const enum Enum{
	A=1,
	B=A*2
}

反向映射

它包含了正向映射(name->value)和反向映射(value->name)

要注意的是不会为字符串枚举成员生产反向映射

enum Types{
	success
}
let success:number=Types.success
let key=Types[success]
console.log(key) //sucess

外部枚举(环境枚举)

外部枚举用来描述已经存在的枚举类型的形状

declare enum Enum{
	A=1,
	B,
	C=2
}

对象与枚举

枚举类型不可以被修改,枚举是一个只读类型的对象。除此之外还有数字枚举和反向映射,要注意的是不会为字符串枚举成员生成反向映射。

const enum EDirection{
	Up,
	Down,
	Left,
	Right
}
const oDirection:{
	Up:0,
	Down:1,
	Left:2,
	Right:3
} as const
EDirection.up   //(enum member) EDirection.Up = 0
oDirection.up   //(property) Up: 0

function walk(dir:EDirection){}

type Direction=typeof oDirection[keyof typeof oDirection];
function run(dir:Direction){}

walk(EDirection.Left);
run(ODirection.Right);
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值