题目
在类型系统里实现通用的 Array.prorotype.unshift 。
例如:
// 将 0 追加到 [1,2] 的开头,返回类型 [0, 1, 2]
type Result = Unshift<[1, 2], 0>;
原题链接
思路
类比 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];