扩展类型有那些?
- 类型别名
- 枚举
- 接口
- 类
类型别名之前已经接触了就不再过多解释,这里主要学习的是枚举
枚举
一般是后端语言的东西,这里学过后端都应该了解,枚举通常用于约束某个变量的取值范围。
像开发一些游戏的上下左右的操作可以用枚举,还有定义用户的性别也可以用枚举,
用户的性别这里之前我们是用的是字面量和联合类型配合使用,也可以达到同样的目标。
但是为什么还要用到枚举呢?这肯定是在用字面量和联合类型配合使用时遇到了问题,所以才不得不使用枚举,什么问题呢
-
字面量类型的问题
-
1、在类型约束位置、会产生重复代码。可以使用类型别名解决该问题,如下
例子: let gender: "男" | "女"; gender="男"; gender="女"; function searchUser(g:"男" | "女"){ //...doing something }
-
2、逻辑含义和真实的值产生了混淆,会导致当修改真实值的时候,产生大量的修改
例子: type Gender ="男" | "女" let gender: Gender; //do something 很多代码 if(true){ gender="男"; }else{ gender="女"; } function searchUser(g:Gender){ //...doing something }
这个时候如果有需求说不要用男女来表示,用其他的比如帅哥/美女,这样改的地方就会很多如 Gender ="帅哥" | "美女",
其他地方给gender变量赋值的也得改不然会报错,万一写了成百上千行代码,这改起来就很麻烦
-
3、字面量类型不会进入到编译结果,而枚举可以
-
-
定义枚举
enum 枚举名 {
//枚举字段1=值1
//枚举字段2=值2
}
在赋值的时候,像使用对象一样
// 如
enum Gender {
male = "男",
female = "女"
}
let gender: Gender;
//do something 很多代码
if(true){
gender= Gender.male;
}else{
gender=Gender.female;
}
function searchUser(g:Gender){
//...doing something
}
编译完成后的代码 由于”男女“是中文转义了,所以使用枚举是可以被编译的
var Gender;
(function (Gender) {
Gender["male"] = "\u7537";
Gender["female"] = "\u5973";
})(Gender || (Gender = {}));
var gender;
//do something 很多代码
var number = Math.random() > 0.5;
if (number) {
gender = Gender.male;
}
else {
gender = Gender.female;
}
如果想要改值也仅仅只需要改 Gender里面的值就行了,其他的不需要动,
当然如果说把逻辑值male|female改了,那没办法得全局改了
enum Gender {
male = "先生",
female = "女士"
}
- 枚举的规则
-
枚举的字段值可以是字符串,也可以是数字
enum Level{ level1=1, level2=2, level3=3 }
-
数字枚举的值会自动自增,如果第一个值不赋值,则第一个值为0,后面依次递增
enum Level{ level1=1, level2, level3 } let l:Level = Level.level1; l = Level.level2 console.log(l)//打印结果是2
-
被数字枚举约束的变量,可以直接赋值为数字,这样的方法不建议使用,这样又在使用真实值
enum Level{ level1, level2, level3 } let l:Level = 1; l = 2 console.log(l)//打印结果是2
-
数字枚举的编译结果 和 字符串枚举有差异
//编译后的结果 var Level; (function (Level) { Level[Level["level1"] = 1] = "level1"; Level[Level["level2"] = 2] = "level2"; Level[Level["level3"] = 3] = "level3"; })(Level || (Level = {})); var l = Level.level1; l = Level.level2;
-
不要在一个枚举中既出现数字,又出现字符串
-
使用枚举时,尽量使用枚举的字段名称,而不使用真实值
-