「TS类型体操03057」实现 Push

232 阅读1分钟

题目

在类型系统里实现通用的 Array.prototype.push 。

例如:

// 将 '3' 追加到 [1,2] 的末尾,返回类型 [1, 2, '3']
type Result = Push<[1, 2], '3'> 

原题链接

实现 Push

思路

类比 JavaScript

类比 JavaScript,就是实现一个函数:

这个函数接收 2参数,第 1 个参数是 1 个数组,第 2 个参数是 1 个值。

新建一个数组,通过解构的方式将原来的数组放入,并将新的追加到新数组末尾。

function myPush(array, item) {
    if (!Array.isArray(array)) {
        throw new TypeError(`第1个参数必须是数组!`);
    }
    
    return [...array, item];
}

提取逻辑点

1. 约束第 1 个参数类型必须是数组类型。
2. 新建数组,解构老数组放入,将新值追加到新数组末尾。

再把逻辑点翻译成 TypeScript 即可。

翻译成 TypeScript

约束第 1 个参数类型必须是数组类型

通过 extends 来约束类型:

type Push<T extends Array<unknown>, U> = ...

新建数组,解构老数组放入,将新值追加到新数组末尾

通过 spread 操作符也就是 ... 实现:

type Push<T extends Array<unknown>, U> = [...T, U];

实现

综上所述,最终的类型工具 Push 实现为:

type Push<T extends Array<unknown>, U> = [...T, U];