扩展类型
- 类型别名
- 枚举
- 接口
- 类
字面量类型的确定
枚举用于约束变量取值范围,字面量类型配合联合类型同样能达到此效果。
- 会有很多重复代码,使用类型别名可以解决
- 逻辑值和真实的值产生混淆,当字面量类型的变量使用很多后,如果需要修改工作量非常大
- 字面量类型不会进入编译结果
枚举
枚举声明
enum 枚举名 {
枚举字段1 = 值1,
枚举字段2 = 值2,
...
}
// 声明
enum Gender {
male = "男",
female = "女"
}
// 访问
const g:Gender = Gender.male;
console.log(g); // 男 原理
创建一个与枚举名称相同的对象,将枚举字段和枚举值分别作为对象的键和值
- 字符串
var Gender;
(function (Gender) {
Gender["male"] = "\u7537";
Gender["female"] = "\u5973";
})(Gender || (Gender = {})); - 数字
var Gender;
(function (Gender) {
Gender[(Gender["male"] = 0)] = "male";
Gender[(Gender["female"] = 1)] = "female";
})(Gender || (Gender = {}));
/** 相当于
{
Gender[0] = "male";
Gender[1] = "female";
Gender["male"] = 0;
Gender["female"] = 1;
}
*/ 枚举规则
- 枚举只能为字符串枚举和数字枚举
- 数字枚举时,会进行数字自增,默认从 0 开始
- 数字枚举和字符串枚举的编译结果不同
- 被数字枚举约束的变量,可以直接赋值为数字
最佳实践
- 一个枚举内不要同时存在字符串枚举和数字枚举
- 使用枚举时尽量使用枚举名,不要使用真实的值
枚举位运算
主要针对数字枚举
位运算:两个数字换算成二进制进行运算
// 权限设置
enum Permission {
Read = 1,
Write = 2,
Updte = 4,
Delete = 8,
}
// 添加权限,通过或运算,0001 | 0010 = 0011
let p: Permission = Permission.Read | Permission.Write;
// 判断是否存在某个权限,通过与运算
function hasPermission(target: Permission, p: Permission) {
return (target & p) === p;
}
console.log(hasPermission(p, Permission.Updte)); // false
// 删除权限,通过异或运算
p ^= Permission.Read;
console.log(p); 
京公网安备 11010502036488号