挑战

在类型系统中实现 JavaScript 的Array.concat函数。它接收 2 个参数并将输入按顺序 输出为一个新数组。

例如:

type Result = Concat<[1], [2]>; // expected to be [1, 2]

解答

在 TypeScript 中处理数组时,变参元组类型通常会在某些情况下发挥作用。他们允许我们 进行泛型展开。稍后我会试着说明。

让我向你展示在 JavaScript 中连接两个数组的实现:

function concat(arr1, arr2) {
  return [...arr1, ...arr2];
}

我们可以使用展开操作符将arr1中的所有元素放入另外一个数组中。我们可以对arr2进 行同样的操作。这里的关键是,它迭代数组或元组中的元素,并将它们粘贴到使用展开操作 符的地方。

可变元组类型允许我们在类型系统中建模相同的行为。如果我们想要连接两个泛型数组,可 以使用展开操作符返回合并后的新数组:

type Concat<T, U> = [...T, ...U];

我们遇到一个错误“A rest element type must be an array type.”。让我们来修复它并让 编译器知道这些类型是数组:

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

参考