题目
在类型系统里实现通用的 Array.prototype.push 。
例如:
// 将 '3' 追加到 [1,2] 的末尾,返回类型 [1, 2, '3']
type Result = Push<[1, 2], '3'>
原题链接
思路
类比 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];