非负整数的四则运算
根据数组长度构造数组
typeBuildArray<Lengthextendsnumber,Itemextendsunknown=unknown,Arrextendsunknown[]=[]>=Arr["length"]extendsLength
? Arr
: BuildArray<Length,Item,[...Arr,Item]>;构造数组 -> 合并数组 -> 求合并后的数组的长度
typeAdd<Num1extendsnumber,Num2extendsnumber>=[
...BuildArray<Num1>,
...BuildArray<Num2>]["length"];extends + infer, Rest 的长度就是两数相减的结果
typeSubtract<Num1extendsnumber,Num2extendsnumber>=BuildArray<Num1>extends[...BuildArray<Num2>, ...infer Rest]
? Rest["length"]
: never;Num1 * Num2 可以看成 Num2 个 Num1 相加(或者 Num1 个 Num2 相加),
使用中间变量ResultArr来保存并传递每次递归的结果。
每次递归使ResultArr里的长度增加 Num1,相应的让 Num2 减 1,递归结束时ResultArr的长度就是最终的结果。
typeMutiply<Num1extendsnumber,Num2extendsnumber,ResultArrextendsunknown[]=[]>=Num2extends0
? ResultArr["length"]
: Mutiply<Num1,Subtract<Num2,1>,[...BuildArray<Num1>, ...ResultArr]>;Num1 / Num2 可以看成 Num1 能够被 Num2 减多少次,直到 Num1 被减完。CountArr用来传递每次递归计算的结果。
typeDivide<Num1extendsnumber,Num2extendsnumber,CountArrextendsunknown[]=[]>=Num1extends0
? CountArr["length"]
: Divide<Subtract<Num1,Num2>,Num2,[...CountArr,unknown]>;