ts-toolbelt Boolean 模块

原创
10/03 14:04
阅读数 32

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

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

代码结构和主要api

 

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

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

 

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

namespace Bool {
  type True = 1;
  type False = 0;
  type Boolean = True | False;
  type BooleanOf<B extends boolean> = B extends true ? 1 : 0;
  type t7 = BooleanOf<true>; // type t7 = 1
  type t8 = BooleanOf<false>; // type t8 = 0

  type Fmt = "b" | "s" | "n";
  type Format<B extends Boolean, F extends Fmt> = {
    0: {
      b: false;
      s: "false";
      n: 0;
    };
    1: {
      b: true;
      s: "true";
      n: 1;
    };
  }[B][F];

  type t11 = Format<True, "b">; // type t11 = true
  type t12 = Format<True, "n">; // type t12 = 1
  type t13 = Format<True, "s">; // type t13 = "true"


  type Not<B extends Boolean> = {
    0: 1;
    1: 0;
  }[B];
  type t1 = Not<True>; // type t1 = 0
  type t2 = Not<False>; // type t2 = 1
  type And<A extends Boolean, B extends Boolean> = {
    0: {
      0: 0;
      1: 0;
    };
    1: {
      0: 0;
      1: 1;
    };
  }[A][B];
  type t3 = And<True, True>; // type t3 = 1
  type t4 = And<True, False>; // type t4 = 0
  type t5 = And<False, True>; // type t5 = 0
  type t6 = And<False, False>; // type t6 = 0

  type Or<B extends Boolean> = {
    0: {
      0: 0;
      1: 1;
    };
    1: {
      0: 1;
      1: 1;
    };
  }[B];

  type Xor<A extends Boolean, B extends Boolean> = {
    0: {
      0: 0;
      1: 1;
    };
    1: {
      1: 0;
      0: 1;
    };
  }[A][B];
}

 

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

namespace Bool2 {
  type True = true;
  type False = false;
  type Boolean = True | False;
  type NumberOf<B extends Boolean> = B extends True ? 1 : 0;

  type And<A extends Boolean, B extends Boolean> = {
    0: {
      0: False;
      1: False;
    };
    1: {
      0: False;
      1: True;
    };
  }[NumberOf<A>][NumberOf<B>];

  type t1 = And<true, true>; // type t1 = true
  type t2 = And<true, false>; // type t2 = false
}

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部