题目
在类型系统里实现 JavaScript 内置的 Array.concat 方法,这个类型接受 2 个参数,返回的新数组类型应该按照输入参数从左到右的顺序合并为一个新的数组。
例如:
type Result = Concat<[1], [2]> // 返回字面量类型 [1, 2]
原题链接
思路
类比 JavaScript
类比 JavaScript,就是实现一个函数:
这个函数接收 2 个数组,将这 2 个数组解构,再拼接到一起,返回 1 个新数组。
function myConcat(arrA, arrB) {
return [...arrA, ...arrB];
}
提取逻辑点
1. 约束接收类型必须是 2 个数组类型。
2. 解构 2 个数组,合成 1 个新数组返回。
再把逻辑点翻译成 TypeScript 即可。
翻译成 TypeScript
约束接收类型必须是 2 个数组类型。
通过 extends 来约束类型:
type Concat<T extends Array<unknown>, U extends Array<unknown>> = ...
解构 2 个数组,合成 1 个新数组返回。
通过 ... 运算符来解构数组:
type Concat<T extends Array<unknown>, U extends Array<unknown>> = [...T, ...U];
实现
综上所述,最终的类型工具 Concat 实现为:
type Concat<T extends Array<unknown>, U extends Array<unknown>> = [...T, ...U];