C#中,枚举本质上是命名的整数值常量,其值必须是整数型,数据结构上是值类型。而TS中的枚举编译后实际上是一个对象,通过立即执行函数来实现,它的值即可以是整数,也可以是字符串,比较多骚操作。
一、C#中的枚举
//1、定义枚举=============================================================
//枚举成员的可访问性,与枚举类型相同
enum Color {
Red, // 0,实际的值,默认从0开始
Green, // 1
Blue // 2
//public Blue //报错,不能有修饰符
}
//2、枚举的调用==========================================================
Color c1 = Color.Red; //(int)c1 结果为0
Color c2 = Color.Green; //(int)c2 结果为1
Color c3 = Color.Blue; //(int)c3 结果为2
//3、改变枚举的底层类型
//默认的底层类型是int,可以修改为其它整数类型
enum Colr:ulong{}
//4、枚举成员的值=========================================================
//如上例,如果没有给成员赋值,则值从0递增----------
//可以显式赋值
enum Color{
Red = 1,
Green = 3,
Blue = 5
}
//只赋值一个,后面递增
enum Color{
Red = 10,
Green, //11
Blue //12
}
enum Color {
Red, // 0
Green = 7,
Blue // 8
}
//成员名不能重复,但值可以重复
enum Color{
Red = 1,
Green = 1,
Blue = 1
}
//4、同类型枚举可以比较===================================================
enum Frist{Mem1,Mem2}
enum Second{Mem1,Mem2}
if(Frist.Mem1 < First.Mem2){} //可以比较
//if(Frist.Mem1 < Second.Mem2){} //报错,不同枚举类型不能相互比较
//5、获取成员名==========================================================
enum Color {
Red,
Green,
Blue
}
Enum.GetName(typeof(Color),1) //Green
foreach(var name in Enum.GetNames(typeof(Color)))
{
... //Red Green Blue
}
二、TS/UTS中的枚举
//1、定义枚举=============================================================
enum Color {
Red, // 0,实际的值,默认从0开始
Green, // 1
Blue // 2
}
//在TS中,enum会被编译为对象,使用立即函数实现
let Color = {
Red: 0,
Green: 1,
Blue: 2
};
//所以,它的作用,实际上可以被as const替代
const Bar = {
A: 0,
B: 1,
C: 2,
} as const;
if (x === Foo.A){}
// 等同于
if (x === Bar.A) {}
//所以,不能定义同名的枚举和常量
enum Color {
Red,
Green,
Blue
}
//const Color = 'red'; // 报错
//2、枚举调用=============================================================
let c = Color.Green; // 1,自动推断类型
// 等同于
let c = Color['Green']; // 1
//标注类型
let c:Color = Color.Green; //1
//反向映射,通过值获取成员名
Color[1] //Color.Green
//TS中的枚举是只读的,不能重新赋值
//Color.Green = 8;//报错
//3、枚举成员的值=========================================================
//如上例,如果没有给成员赋值,则值从0递增----------
//可以显式赋值
enum Color{
Red = 1,
Green = 3,
Blue = 5
}
//只赋值一个,后面递增
enum Color{
Red = 10,
Green, //11
Blue //12
}
enum Color {
Red, // 0
Green = 7,
Blue // 8
}
//除了数值,还可以是字符串
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
enum Enum {
One = 'One',
Two = 'Two',
Three = 3,
Four = 4,
}
//4、获取所有成员值或成员名===============================================
enum MyEnum {
A = 'a',
B = 'b'
}
type Foo = keyof typeof MyEnum; // 'A'|'B' //成员名
enum MyEnum {
A = 'a',
B = 'b'
}
type Foo = { [key in MyEnum]: any }; // { a:any, b: any }
//5、使用枚举的一个案例==================================================
enum Operator {
ADD,
DIV,
MUL,
SUB
}
function compute(
op:Operator,
a:number,
b:number
) {
switch (op) {
case Operator.ADD:
return a + b;
case Operator.DIV:
return a / b;
case Operator.MUL:
return a * b;
case Operator.SUB:
return a - b;
default:
throw new Error('wrong operator');
}
}
compute(Operator.ADD, 1, 3) // 4