扩展类型
- 类型别名
- 枚举
- 接口
- 类
字面量类型的确定
枚举用于约束变量取值范围,字面量类型配合联合类型同样能达到此效果。
- 会有很多重复代码,使用类型别名可以解决
- 逻辑值和真实的值产生混淆,当字面量类型的变量使用很多后,如果需要修改工作量非常大
- 字面量类型不会进入编译结果
枚举
枚举声明
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);