返回
TypeScript 编程必备:使用类型实现自然数加减乘除
前端
2023-12-20 22:01:21
在 TypeScript 中,我们可以通过数组的 length 属性读取出值。通过构造数组,进而实现加减乘除。
生成数组
目标:通过泛型实现生成指定数组,效果为:
type 数组<3> = [1, 2, 3]
实现:
type 数组<L extends number, T extends unknown[] = []> =
T["length"] extends L ? T : 数组<L, [unknown, ...T]>;
加法
目标:实现两个数组相加,效果为:
type 加法<[1, 2, 3], [4, 5, 6]> = [1, 2, 3, 4, 5, 6]
实现:
type 加法<A extends unknown[], B extends unknown[]> =
A extends [] ? B : B extends [] ? A :
[...数组<A["length"]>, ...B];
减法
目标:实现两个数组相减,效果为:
type 减法<[1, 2, 3], [1, 2]> = [3]
实现:
type 减法<A extends unknown[], B extends unknown[]> =
A extends [infer H, ...infer T] ?
B extends [infer H2, ...infer T2] ?
减法<T, T2> : A :
[];
乘法
目标:实现两个数组相乘,效果为:
type 乘法<[1, 2], [3, 4, 5]> = [3, 4, 5, 6, 8, 10, 12, 15]
实现:
type 乘法<A extends unknown[], B extends unknown[]> =
A extends [infer H, ...infer T] ?
B extends [infer H2, ...infer T2] ?
加法<乘法<A, T2>, 乘法<数组<H2>, T>> :
[] :
[];
除法
目标:实现两个数组相除,效果为:
type 除法<[1, 2, 3, 4], [2]> = [0, 1]
实现:
type 除法<A extends unknown[], B extends unknown[]> =
B extends [infer H, ...infer T] ?
H extends 0 ? [] :
A extends [infer H2, ...infer T2] ?
减法<A, 乘法<B, 减法<数组<H2>, 数组<1>>>> :
[] :
[];
通过上述实现,我们就可以使用 TypeScript 类型来轻松实现自然数的加减乘除运算。这种方法不仅简单易懂,而且非常灵活,可以轻松扩展到任意精度。