扩展类型

  1. 类型别名
  2. 枚举
  3. 接口

字面量类型的确定

枚举用于约束变量取值范围,字面量类型配合联合类型同样能达到此效果。

  1. 会有很多重复代码,使用类型别名可以解决
  2. 逻辑值和真实的值产生混淆,当字面量类型的变量使用很多后,如果需要修改工作量非常大
  3. 字面量类型不会进入编译结果

枚举

枚举声明

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;
}
*/

枚举规则

  1. 枚举只能为字符串枚举和数字枚举
  2. 数字枚举时,会进行数字自增,默认从 0 开始
  3. 数字枚举和字符串枚举的编译结果不同
  4. 被数字枚举约束的变量,可以直接赋值为数字

最佳实践

  1. 一个枚举内不要同时存在字符串枚举和数字枚举
  2. 使用枚举时尽量使用枚举名,不要使用真实的值

枚举位运算

主要针对数字枚举

位运算:两个数字换算成二进制进行运算

// 权限设置
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);