Skip to content

Zip

约 447 字大约 1 分钟

2022-12-01

题目

Github: Zip

在此挑战中,您需要实现一个类型 Zip<T, U>,其中 TU 必须是元组。

type exp = Zip<[1, 2], [true, false]> // expected to be [[1, true], [2, false]]

解题思路

这个挑战要求我们创建一个分组元素的数组,数组的第一个元素包含数组 TU 的第一个元素, 数组的第二个元素包含数组 TU的第二个元素,以此类推。

首先添加类型参数 L 用于保存分组元素的数组,初始值为空数组。

L 为空数组时,此时 数组长度 L['length']0,我们恰好可以从数组 TU 中通过索引下标获取第一个元素, 并将其添加到 L 中,此时 L 的类型结果为 [T[0], U[0]],然后继续递归调用 Zip

L 的长度为 数组 TU 的最小长度时,则表示递归结束。

答案

type Zip<T extends any[], U extends any[], L extends any[] = []> =
  L['length'] extends T['length'] | U['length']
    ? L
    : Zip<T, U, [...L, [T[L['length']], U[L['length']]]]>

验证

type 
cases
= [
Expect
<
Equal
<
Zip
<[], []>, []>>,
Expect
<
Equal
<
Zip
<[1, 2], [true, false]>, [[1, true], [2, false]]>>,
Expect
<
Equal
<
Zip
<[1, 2, 3], ['1', '2']>, [[1, '1'], [2, '2']]>>,
Expect
<
Equal
<
Zip
<[], [1, 2, 3]>, []>>,
Expect
<
Equal
<
Zip
<[[1, 2]], [3]>, [[[1, 2], 3]]>>,
]

参考