参考:满哥的笔记
Javascript 中没有枚举的概念,但是在Typescript中补充了枚举的类型。
这种类型可以有效的解决强耦合的魔法字符串的代码,如果代码中多处使用了魔法字符串,可以考虑使用枚举类型来降低代码的耦合。
补充:魔法字符串可以理解为多个地方使用了同一个字面量字符串进行直接赋值的行为。
数字枚举
// 定义一个数字枚举
enum Types {
Red,
Green,
Blue
}
// 如果不给值,就是默认从0开始,等同于如下
enum Types {
Red = 0,
Green = 1,
Blue = 2
}
// 增长枚举 第一个枚举值赋值为1, 之后的枚举值就会从1开始递增
// 也就是 Green = 2,Blue = 3。
enum Types {
Red = 1,
Green,
Blue
}
字符串枚举
在字符串枚举里,每个成员都必须使用字符串字面量进行赋值初始化,或者使用另外一个字符串枚举成员的值进行赋值初始化。
// 定义一个字符串初始值
enum Types {
Red = 'Red',
Green = 'Green',
Blue = 'Blue'
}
由于字符串枚举没有自增长的行为,字符串枚举可以很好的序列化,也就是在运行时是有意义的且可读的,是独立与枚举成员的名字。
不同于数字字符串赋值了第一个枚举值,就会影响后面枚举成员的值。
异构枚举
异构枚举就是混合了字符串类型和数字类型的枚举。
enum Types {
value1 = "hello world",
value2 = 0
}
接口枚举
一个枚举的成员作为一个接口的属性时,在给使用该接口的变量赋值时也只能使用那个用于接口定义的枚举成员属性。
// 定义一个数字枚举
enum Types {
value1,
value2
}
// 定义一个接口使用枚举
interface IA {
a: Types.value1,
b: Types.value2
}
// 使用接口定义变量, 必须符合接口规范
let obj: IA {
a: Types.value1,
b: Types.value2
}
const枚举
const枚举也就是常量枚举,不同于普通的枚举,常量枚举会在编译阶段被删除,除非有地方使用到了常量枚举中的成员值,被使用的成员值就会在被使用的地方内联进来。
之所以会在编译阶段被删除,是因为常量枚举不允许包含计算成员。
常量枚举主要用于在某些需求严格的情况,是为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问的时候,可以考虑使用常量枚举(const 枚举)。
注意:常量枚举不能使用 let 与 var 定义。
// 定义一个常量枚举
const enum Person {
per1,
per2,
per3
}
// 定义一个使用常量枚举的变量,其中 Person.per3 没有被使用就会在编译阶删除
let person = [Person.per1, Person.per2] // 生成的person变量就是 [0, 1]
映射
枚举成员的使用,分为正向映射(name -> value) 和 反向映射(value -> name)
注意:字符串枚举成员没有反向映射。
// 定义一个枚举
enum Enum {
value
}
// 正向映射 也就是使用点引用,返回枚举成员属性值
let a = Enum.value
cosnole.log(a) // 0
// 反向映射 也就是使用中阔号引用, 返回枚举成员属性名
let b = Enum[value]
cosnole.log(a) // value