「TS类型体操03057」实现 Unshift

78 阅读1分钟

题目

在类型系统里实现通用的 Array.prorotype.unshift 。

例如:

// 将 0 追加到 [1,2] 的开头,返回类型 [0, 1, 2]
type Result = Unshift<[1, 2], 0>;

原题链接

实现 Unshift

思路

类比 JavaScript

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

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

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

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

提取逻辑点

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

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

翻译成 TypeScript

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

通过 extends 来约束类型:

type Unshift<T extends unknown[], U> = ...

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

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

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

实现

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

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