字面量类型的问题
- 在类型约束位置 会产生重复代码 可以使用类型别名解决该问题
let Gender = "男" | "女";
let user1Gender = "男";
let user2Gender = "女";
function getUserGender(g: Gender):[]{
return [];
}
- 当字面量类型的值发生修改时 所有赋值给变量的字面量类型都需要修改
let Gender = "男" | "女"; // 修改成 "male" | "female"时 下面所有对变量的赋值都需要修改
let user1Gender:Gender = "男";
let user2Gender:Gender = "女";
- 字面量类型不会进入到编译结果 无法获取到字面量类型的所有值
扩展类型-枚举
扩展类型:类型别名 枚举 接口 类
枚举通常用于约束某个变量的取值范围(字面量 + 联合类型也可以达到相同的效果)
如何定义一个枚举
enum 枚举的名称{
枚举字段1 = 值1,
枚举字段2 = 值2
}
枚举会出现在编译结果中,编译结果中表现为对象
枚举的规则:
-
枚举的字段值可以是字符串或者数字,分别称为字符串枚举、数字枚举
-
数字枚举的值会自动自增
enum Level {
level1 = 1,
level2 = 2,
level3 = 3
}
// 如果level2 不赋值 默认为2
// 如果level1 不赋值 默认为0
- 被数字枚举约束的变量 可以直接赋值为数字
enum Level {
level1 = 1,
level2 = 2,
level3 = '222'
}
let l:Level = 1; // 不报错
let L:Level = '222' // 不行
- 数字枚举的编译结果 和 字符串枚举的编译结果有差异
// TypeScript定义的枚举类型
enum Level {
level1 = 1,
level2 = 2,
level3 = '222'
}
// 编译结果
var Level = {
"level1":1,
"level2":2,
"level3":'222',
"1":"level1",
"2":"level2"
}
最佳实践
尽量不要在一个枚举中既出现字符串类型 又出现数字类型
使用枚举时 尽量使用枚举字段的名称 不要使用真实名称
扩展知识:位枚举(枚举的位运算)
- 针对数字类型
位运算:两个数字换算成二进制后进行的运算
enum Permission{
Read = 1, // 2^0 => 0001
Write = 2, // 2^1 => 0010
Create = 4, // 2^2 => 0100
Delete = 8 // 2^3 => 1000
}
// 如何组合某种权限 |运算 存在1 取1
let p:Permission = Permission.Read | Permission.Write;
/**如何判断是否拥有某种权限
* &运算 相同取1
* @param {Permission} target 需要判断的目标权限值
* @param {Permission} per 枚举类型中的值
* @return {boolean}
*/
function hasPermission(target:Permission, per:Permission): boolean{
return (target & per) === per
}
let result = hasPermission(p, Permission.Read);
console.log(result)
// 如何删除某个权限 ^(异或)运算 相同取0 不同取1
p = Permission.Read ^ p;
console.log(hasPermission(p, Permission.Read))