扩展类型-枚举
扩展类型:类型别名、枚举、接口、类
枚举通常用于约束某个变量的取值范围。
字面量类型和联合类型配合使用,也可以达到同样的目标。
字面量类型的问题
- 在类型约束位置,会产生重复代码。可以使用类型别名解决该问题。
- 逻辑含义和真实的值产生了混淆,会导致当修改真实值的时候,产生大量的修改。
- 字面量类型不会进入到编译结果
枚举
enum Gender{
male = "男",
female = "女"
}
let gender: Gender;
<!-- gender赋值的是逻辑名称 取的是真实值 -->
gender = Gender.male;
gender = Gender.female;
function prontGenders() {
const vals = Object.values(Gender);
vals.forEach => console.log(v);
}
如果逻辑名变了可以使用f2进行重构
枚举会出现在编译结果中,表现为对象
- 枚举 的属性值 为数字 或 字符串
- 数字枚举(数字)的值会自动自增
enum Level {
level1: 1, // 1
level2, // 2
level3, // 3
}
enum Level {
level1, // 0
level2, // 1
level3, // 2
}
- 被数字枚举约束的变量可以直接赋值为数字
最佳实践:
- 尽量不要在一个枚举中既出现字符串字段,又出现数字字段
- 使用枚举时,尽量使用枚举字段的名称,而不使用真实的值
function getUsers(lev: Level) {
}
getUsers(Level.level2);
扩展知识:位枚举(枚举的位运算)
针对的数字枚举
位运算: 两个数字换算成二进制后进行的运算
enum Permission {
Read = 1, // 0001
Write = 2, // 0010
Create = 4, // 0100
Delete = 8 // 1000
}
// 1.如何组合权限
// 使用或运算
// 0001
// 或
// 0010
// 0011
let p = Permission.Read | Permission.Write;
// 2. 如何判断是否拥有某个判断
// 0011
// 且
// 0010
// 0010
function hasPermission(target: Permission, per: Permission) {
return (target & per) === per;
}
console.log(hasPermission(p, Permission.Read));
// 3.如何删除某个权限
// 0011
// 异或
// 0010
// 0001
p = p^Permission.Write;
console.log(hasPermission(p, Permission.Write));