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