挑战

实现泛型版本的Array.push。例如:

type Result = Push<[1, 2], "3">; // [1, 2, '3']

解答

这个实际上很简单。要实现一个将元素插入数组的类型,我们需要做 2 件事。第一件事是 获取数组的所有元素,第二件事是向它们插入一个额外的元素。

要从数组中获取所有元素,可以使用可变参数元组类型。因此,让我们返回一个具有输入类 型T中相同元素的数组:

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

得到一个编译错误“A rest element type must be an array type”。这意味着我们不能在 非数组类型上使用可变元组类型。因此,让我们添加一个通用的约束来表明我们只处理数组 :

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

现在,我们有一个类型参数T传入的数组副本。剩下的就是添加传入的元素U:

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

这样,我们就在类型系统中实现了一个 push 操作。

参考