目录
- 1,枚举
- 2,定义枚举
- 3,枚举的规则
- 1,枚举的值可以是字符串或数字,分别称为字符串枚举、数字枚举
- 2,数字枚举的值会自增
- 3,枚举会出现在编译结果中,并且数字枚举和字符串枚举,编译结果有差异
- 4,被数字约束的变量,可以直接赋值为数字
- 4,最佳实践
- 5,枚举的位运算
1,枚举
作用:通常用于约束某个变量的取值范围。
虽然字面量+联合类型,也能实现这个作用。但字面量类型不会进入编译结果。
let gender: '男' | '女'
编译结果
let gender;
2,定义枚举
enum 枚举名称 {枚举字段1 = 值1,枚举字段2 = 值2
}
3,枚举的规则
1,枚举的值可以是字符串或数字,分别称为字符串枚举、数字枚举
字符串枚举
enum Gender {male = '男',famale = '女'
}
数字枚举
enum Level {level1 = 1,level2 = 2,level3 = 3,
}
2,数字枚举的值会自增
第1个默认从 0 开始。
enum Level {level1 = 1,level2,level3 = 5,level4,level5,
}
相当于
// 数字枚举
enum Level {level1 = 1,level2 = 2,level3 = 5,level4 = 6,level5 = 7,
}
3,枚举会出现在编译结果中,并且数字枚举和字符串枚举,编译结果有差异
enum Level {level1 = 1,level2 = 2,level3 = '3'
}
编译结果
var Level = {1: "level1",2: "level2",level1: 1,level2: 2,level3: "3",
};
并且因为会出现在编译结果中,所以可以在 ts 中直接使用
const L: Level = Level.level1
4,被数字约束的变量,可以直接赋值为数字
以上面的例子来说,也可以直接赋值为 1 或 2
const L1: Level = Level.level1
const L2: Level = 1
但赋值为字符串,会报错。
const L3: Level = "3"
4,最佳实践
- 尽量不要在一个枚举中即出现字符串字段,又出现数字字段。
- 使用枚举时,尽量使用枚举字段的名称,而不使用真实的值。
以上面的例子来说:
const L: Level = Level.level1// 不推荐
const L2: Level = 1
5,枚举的位运算
典例:用于控制权限
enum Permisson {Read = 1, // 2^0 0001Write = 2, // 2^1 0010Create = 4, // 2^2 0100Delete = 8, // 2^3 1000
}
1,位运算 |
或,表示操作数对应的二进位有一个是 1,则返回 1。比如 0001 | 0010 返回 0011
增加读写权限:
const pReadAndWrite = Permisson.Read | Permisson.Write
2,位运算 &
与,表示操作数对应的二进位都是 1 则返回1。比如 0011 | 0010 返回 0010
判断权限:
function hasPermission(target: Permisson, somePer: Permisson) {return (target & somePer) === somePer
}
hasPermission(pReadAndWrite, Permisson.Read) // true
hasPermission(pReadAndWrite, Permisson.Write) // true
hasPermission(pReadAndWrite, Permisson.Create) // false
3,位运算 ^
异或,表示操作数对应的二进位不相同时才返回 1。比如 0011 | 0010 返回 0001
删除写权限:
let pOnlyRead = pReadAndWrite ^ Permisson.Write
以上。