扩展类型 - 枚举
扩展类型:类型别名、枚举、接口、类
枚举通常用于约束某个变量的取值范围。
字面量和联合类型配合使用,也可以达到同样的目标。
字面量类型的问题
-
在类型约束位置,会产生重复代码。可以使用类型别名解决该问题。
type Gender = '男' | '女'; let gender: Gender; gender = '男'; gender = '女'; function searchUser(g: Gender) {}使用类型别名后,是可以解决上述问题,当时,当我们要修改
Gender的取值时,我们要修改gender的真实值,当代码很多的时候,会显得很繁琐。 -
逻辑含义和真实的值产生了混淆,会导致修改真实值的时候,产生大量的修改。
那么什么是逻辑含义和真实值呢。逻辑含义的意思是
男和女本身,它的真实值可以是男士和女士,也可以是帅哥和美女,但逻辑含义是不会变化的。 因为可能遇到修改真实值的情况,使用字面量类型不是最优选择,因而会有枚举这种方式。enum Gender { male = '男', female = '女' } let gender: Gender; gender = Gender.male; gender = Gender.female; function searchUser(g: Gender) {} -
字面量类型不会进入编译结果。
使用字面量类型的编译结果。
let gender; gender = '男'; gender = '女'; function searchUser(g) { }使用枚举的编译结果。
var Gender; (function (Gender) { Gender["male"] = "\u7537"; Gender["female"] = "\u5973"; })(Gender || (Gender = {})); let gender; gender = Gender.male; gender = Gender.female; function searchUser(g) { }使用枚举的编译结果中增加了一个立即执行函数,参数是
Gender。这意味着枚举是参与到函数运行中的,并且是作为一个对象。基于此,在ts代码中就可以输出Gender的属性值。
枚举
如何定义一个枚举
enum 枚举名 {
枚举字段1 = 值1,
枚举字段2 = 值2
}
枚举会出现到编译结果中。
枚举的规则:
-
枚举的字段值可以是字符串或数字 数字枚举的值会自动自增,默认为1,默认依次递增,也可以用相应的规则,如1,2,4,8
-
被数字枚举约束的变量,可以直接赋值为数字(最好不用,尽量使用逻辑名称)。
-
数字枚举的编译结果 和 字符串枚举有差异
enum Level { level1 = 1, level2 = 2, level3 = 3 } let l: Level; l = Level.level1; console.log(l); console.log(Level)编译结果
var Level; (function (Level) { Level[Level["level1"] = 1] = "level1"; Level[Level["level2"] = 2] = "level2"; Level[Level["level3"] = 3] = "level3"; })(Level || (Level = {})); let l; l = Level.level1; console.log(l); console.log(Level)如果是数字枚举,编译结果输出的Level是
{ '1': 'level1', '2': 'level2', '3': 'level3', level1: 1, level2: 2, level3: 3 }如果是字符串类型,则为
{ level1: '1', level2: '2', level3: '3' }
最佳实践
- 尽量不要在一个枚举中既出现字符串字段,又出现数字字段。
- 使用枚举时,尽量使用枚举字段的名称,而不是真实的值