ts-toolbelt Boolean 模块

原文链接: ts-toolbelt Boolean 模块

上一篇: react 异常捕获

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

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

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

代码结构和主要api

up-a7a881a67aa5d244f13dcbf18a12c161c1f.pngup-43db1d4f9e18066b6f166733a69fb7e60d1.png

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

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

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

up-93a0a524d68ac1649beb02bb7d668907d45.png

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];
}

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

up-c2d633c4a4666b016f98a93adcaa6ef846e.png

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值