扩展类型-枚举

扩展类型:类型别名, 枚举,接口,类

枚举通常用于约束某个变量的取值范围。

子面量和联合类型配合使用,也可达到同样的目标。

子面量类型的问题

  • 在类型约束位置,会产生重复代码,可以使用别名解决该问题。
  • 逻辑恨意和真实的值产生了混淆,会导致当前修改真实值的时候产生大量的修改。
  • 子面量类型不会进入编译结果。

为什么要用枚举? 就是有时候我们需要修改变量后,后面的都需要修改,这就是逻辑含义和真实产生的值有混淆

比如说:当前 type Gender : "男" :"女"

此时这个Gender只能书写男和女,但是后期维护的时候我们可能产生了靓仔,靓女这养的称呼,但是我们有很多代码需要更改,这就有点麻烦了。

所以才需要枚举来解决这个问题。

枚举

如何定义一个枚举

  1. 注意枚举中的健值对的形式不是`**:**`形式的
  2. enum 枚举名{
  3. 枚举字段1 = 1,
  4. 枚举字段2 = 2,
  5. }

枚举会出现在编译结果中,编译结果中变现为对象。

  1. .ts书写
  2. enum Gander {
  3. male = "男",
  4. female = "女"
  5. }
  6. let gander : Gander;
  7. gander = Gander.male;
  8. gander = Gander.female;
  9. console.log(gander);
  1. .js编译出来后
  2. var Gander;
  3. (function (Gander) {
  4. Gander["male"] = "\u7537";
  5. Gander["female"] = "\u5973";
  6. })(Gander || (Gander = {}));
  7. let gander;
  8. gander = Gander.male;
  9. gander = Gander.female;
  10. console.log(gander);

枚举的规则

  • 枚举的字段值可以是字符串或数字。
  • 数字媒体的值会自动自增
  • 没数字枚举约束的变量,可以直接复制为数字。
  • 数字枚举的编译结果 和 字符串枚举有差异。

最佳实践

  • 尽量不要在一个枚举中出现字符串字段,又出现数字字段。
  • 使用枚举是,精良使用枚举字段的名称,而不是使用真实值【就想使用对象中的属性名一样】。

推荐使用枚举,不推荐使用别名枚举不是直接书写值的,所以有利于维护,但是小应用场景可以使用别名。

扩展 位枚举(枚举的位运算)

针对的数据枚举

位运算:两个数换成而二进制后进行的运算。

权限组合

或运算 : 0001 | 0010有一个数为1的时候就为一

且运算 : 0001 & 0010两个为1的时候才为1

异或运算 :0011 ^ 0010相同取0 不同取 1

  1. enum Permission{
  2. Read = 1, // 2 ^ 0 0001
  3. Write = 2, // 2 ^ 2 0010
  4. Create = 4,// 2 ^ 3 0100
  5. Delete = 8 // 2 ^ 4 1000
  6. }
  7. // 1. 如何组合权限
  8. /**
  9. * 枚举的位运算
  10. * 【|】或运算
  11. * 0001
  12. * 或 - 有真为真
  13. * 0010
  14. * =0011
  15. *
  16. * 就有可读写的权限
  17. *
  18. */
  19. let p = Permission.Read | Permission.Write;
  20. // 2. 如何判断是否拥有某个权限
  21. /**
  22. * 0011
  23. * 【 & 】且运算 - 真真为真,其他为假
  24. * 0010
  25. * =0010
  26. */
  27. function hasPermission(target: Permission, per: Permission){
  28. return (target & per) == per;
  29. }
  30. // 判断变量p是否有可读权限
  31. console.log(hasPermission(p,Permission.Write))
  32. // 3. 如何删除某个权限
  33. /**
  34. * 0011
  35. * 【^】异或 : 相同取0 不同取1
  36. * 0010
  37. *=0001
  38. */
  39. p = p ^ Permission.Write;
  40. console.log(hasPermission(p,Permission.Write))