当前位置:   article > 正文

ts-toolbelt Boolean 模块

tstool

原文链接: ts-toolbelt Boolean 模块

上一篇: react 异常捕获

下一篇: js class 中 成员函数和箭头函数的注意点

主要思想是自己实现了一套Boolean类型, 使用数字1,0代表真假, 并且使用map和fmt等做了格式化和计算操作

这个是该库最简单的模块, 先从这个入手

代码结构和主要api

up-a7a881a67aa5d244f13dcbf18a12c161c1f.pngup-43db1d4f9e18066b6f166733a69fb7e60d1.png

用真值表的方式实现逻辑运算

提供format函数, 用于将自定义值转换为其他类型的

但是vscode的提示是按照本身的值做的, 因为用的alias数字的方式, 所以还是有点不太好, 感觉框架内部应该使用这种数字进行封装, 外部依然传入boolean值, 不然和其他库使用的时候会不会出现一些问题

up-93a0a524d68ac1649beb02bb7d668907d45.png

  1. namespace Bool {
  2. type True = 1;
  3. type False = 0;
  4. type Boolean = True | False;
  5. type BooleanOf<B extends boolean> = B extends true ? 1 : 0;
  6. type t7 = BooleanOf<true>; // type t7 = 1
  7. type t8 = BooleanOf<false>; // type t8 = 0
  8. type Fmt = "b" | "s" | "n";
  9. type Format<B extends Boolean, F extends Fmt> = {
  10. 0: {
  11. b: false;
  12. s: "false";
  13. n: 0;
  14. };
  15. 1: {
  16. b: true;
  17. s: "true";
  18. n: 1;
  19. };
  20. }[B][F];
  21. type t11 = Format<True, "b">; // type t11 = true
  22. type t12 = Format<True, "n">; // type t12 = 1
  23. type t13 = Format<True, "s">; // type t13 = "true"
  24. type Not<B extends Boolean> = {
  25. 0: 1;
  26. 1: 0;
  27. }[B];
  28. type t1 = Not<True>; // type t1 = 0
  29. type t2 = Not<False>; // type t2 = 1
  30. type And<A extends Boolean, B extends Boolean> = {
  31. 0: {
  32. 0: 0;
  33. 1: 0;
  34. };
  35. 1: {
  36. 0: 0;
  37. 1: 1;
  38. };
  39. }[A][B];
  40. type t3 = And<True, True>; // type t3 = 1
  41. type t4 = And<True, False>; // type t4 = 0
  42. type t5 = And<False, True>; // type t5 = 0
  43. type t6 = And<False, False>; // type t6 = 0
  44. type Or<B extends Boolean> = {
  45. 0: {
  46. 0: 0;
  47. 1: 1;
  48. };
  49. 1: {
  50. 0: 1;
  51. 1: 1;
  52. };
  53. }[B];
  54. type Xor<A extends Boolean, B extends Boolean> = {
  55. 0: {
  56. 0: 0;
  57. 1: 1;
  58. };
  59. 1: {
  60. 1: 0;
  61. 0: 1;
  62. };
  63. }[A][B];
  64. }

自己的封装, 可以看到框架是可以对这层进行抽象的, 不过数字的好处就是运算和处理方便点, 不过类型的语义性也是需要考虑的, 框架多做一点, 开发者就可以偷点懒了

up-c2d633c4a4666b016f98a93adcaa6ef846e.png

  1. namespace Bool2 {
  2. type True = true;
  3. type False = false;
  4. type Boolean = True | False;
  5. type NumberOf<B extends Boolean> = B extends True ? 1 : 0;
  6. type And<A extends Boolean, B extends Boolean> = {
  7. 0: {
  8. 0: False;
  9. 1: False;
  10. };
  11. 1: {
  12. 0: False;
  13. 1: True;
  14. };
  15. }[NumberOf<A>][NumberOf<B>];
  16. type t1 = And<true, true>; // type t1 = true
  17. type t2 = And<true, false>; // type t2 = false
  18. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/626509
推荐阅读
相关标签
  

闽ICP备14008679号