返回

TypeScript 编程必备:使用类型实现自然数加减乘除

前端

在 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 类型来轻松实现自然数的加减乘除运算。这种方法不仅简单易懂,而且非常灵活,可以轻松扩展到任意精度。