// your answers
type Zip<T extends any[], U extends any[]> = [T, U] extends [[infer F1, ...infer R1], [infer F2, ...infer R2]]
? [[F1, F2], ...Zip<R1, R2>]
: [];
Solution by pea-sys #33027
type Zip<T extends unknown[], U extends unknown[]> = [T, U] extends [[infer F1, ...infer R1], [infer F2, ...infer R2]]
? [[F1, F2], ...Zip<R1, R2>]
: [];
Solution by keyurparalkar #32513
type Zip<T, U, R extends any[] = []> = T extends [infer R1, ...infer R2] ? U extends [infer R3, ...infer R4] ? Zip<R2,R4,[...R,[R1, R3]]> : R : R
Solution by Zhen-code #32008
type Zip<T extends any[], U> = T extends []
? []
: U extends any[]
? { [P in keyof U]: P extends keyof T ? [T[P], U[P]] : [] }
: [];
Solution by rarysson #30833
type Zip<T extends readonly any[], U extends readonly any[]> =
[T, U] extends [[infer TF, ...infer TR], [infer UF, ...infer UR]]
? [[TF, UF], ...Zip<TR, UR>]
: []
Solution by matallui #30808
Solution:
type Zip<T, U> = T extends []
? []
: U extends []
? []
: T extends [infer FirstT, ...infer RestT]
? U extends [infer FirstU, ...infer RestU]
? [[FirstT, FirstU], ...Zip<RestT, RestU>] : [] : [];
Solution by DmitriiBr #30285
type Zip<T extends unknown[], U extends unknown[], R extends unknown[] = []> =
T extends [infer A, ...infer AR]
?
U extends [infer B, ...infer BR]
?
Zip<AR, BR, [...R, [A, B]]>
: R
: R
Solution by zhangqiangzgz #30194
type Zip<T extends unknown[], U extends unknown[]> =
T extends [infer A, ...infer B] ?
U extends [infer C, ...infer D] ?
[[A, C], ...Zip<B, D>]
: []
: []
Solution by tclxshunquan-wang #29819
type Zip<T, U> = T extends [infer F1, ...infer R1]
? U extends [infer F2, ...infer R2]
? [[F1, F2], ...Zip<R1, R2>]
: []
: [];
Solution by DoubleWoodLin #28740
type Zip<
T extends unknown[],
U extends unknown[],
A extends unknown[] = []
> = T extends [infer TF, ...infer TR]
? U extends [infer UF, ...infer UR]
? Zip<TR, UR, [...A, [TF, UF]]>
: A
: A;
Solution by DoGukKim #28475
// 你的答案
/**
* over array index value is undefined.
* //type case1 = undefined
type case1 = [1, 2][3]
*/
type Zip<
T extends any[],
U extends any[],
K extends any[] = [],
S extends any[] = [],
> = T extends [infer A, ...infer B]
? U[K['length']] extends undefined
? S
: Zip<B, U, [...K, 1], [...S, [A, U[K['length']]]]>
: S
Solution by xpbsm #28466
type Zip<T extends any[], U extends any[], P extends any[] = []> = T extends [infer TF, ...infer TR] ? U extends [infer UF, ...infer UR] ? Zip<TR, UR, [...P, [TF, UF]]> : P : P
Solution by Xjc666666 #28453
type Zip<T extends unknown[], U extends unknown[]> = T extends [
infer L,
...infer RestT
]
? U extends [infer R, ...infer RestU]
? [[L, R], ...Zip<RestT, RestU>]
: []
: [];
Solution by jiaowoxiaobala #27964
// your answers
type Zip<A extends any[], B extends any[], L extends any[] = []> = L['length'] extends A['length'] | B['length']
? L
: Zip<A, B, [...L, [A[L['length']], B[L['length']]]]>
Solution by GreattitJY #27697
type Zip<T, U, Acc extends unknown[] = []> = T extends [
infer TFirst,
...infer TRest
]
? U extends [infer UFirst, ...infer URest]
? Zip<TRest, URest, [...Acc, [TFirst, UFirst]]>
: Acc
: Acc;
Solution by alythobani #27589
type GetFirstEl<T extends any[]> = T extends [infer First, ...infer _] ? First : []
type DropFirst<T extends any[]> = T extends [infer _, ...infer Rest] ? Rest : []
type HasLength<T extends any[]> = T extends [infer First, ...infer Rest]
? true
: false
type Zip<T extends any[], U extends any[], R extends any[] = []> = T extends [infer First, ...infer Rest]
? HasLength<U> extends true
? Zip<Rest, DropFirst<U>, [...R, [First, GetFirstEl<U>]]>
: R
: R
Solution by jazelly #27535
// your answers
type Zip<T extends any[], U extends any[], Z extends any[] = []> = T extends [infer TH, ...infer TRest] ? U extends [infer UH, ...infer URest] ?
Zip<TRest, URest, [...Z, [TH, UH]]>
: Z : Z
Solution by hhk9292 #27439
type Zip<T extends any[], U extends any[]> = [T, U] extends [[infer A, ...infer R1], [infer B, ...infer R2]] ? [[A, B], ...Zip<R1, R2>] : []
Solution by smileboyi #27052
type Zip<
T extends unknown[],
U extends unknown[],
Result extends unknown[] = []
> = T extends [infer R, ...infer V]
? U extends [infer R2, ...infer V2]
? Zip<V, V2, [...Result, [R, R2]]>
: Result
: Result;
Solution by ryuji-1to #26993
type Zip <A1 extends any[], A2 extends any[]> = [[A1[0], A2[0]], [A1[1], A2[1]]]
Solution by 20yuteo #26969
type Zip<T extends any[], U extends any[], Res extends any[]=[]> =
T extends [infer FT, ...infer LT]
? U extends [infer FU, ...infer LU]
? Zip<LT, LU, [...Res, [FT, FU]]>
: Res
: Res
Solution by HaoxueAllen #26631
type Zip<T extends any[], U extends any[]> = T extends [
infer FirstT,
...infer RestT
]
? U extends [infer FirstU, ...infer RestU]
? [[FirstT, FirstU], ...Zip<RestT, RestU>]
: []
: [];
Solution by seeyoujeong #26510
type Zip<T extends unknown[], U extends unknown[]> = T extends [infer Head, ...infer Tail] ? U extends [infer HeadU, ...infer TailU] ? [[Head, HeadU], ...Zip<Tail, TailU>] : [] : []
Solution by ScarboroughCoral #26474
type Zip<T extends any[], U extends any[]> = [T, U] extends [
[infer THead, ...infer TRest],
[infer UHead, ...infer URest],
]
? [[THead, UHead], ...Zip<TRest, URest>]
: []
Solution by valentynpodkradylin #26233
/*
使用 infer 推断类型,边界情况(为空)返回空数组,否则递归求解
*/
type Zip<T extends any[], U extends any[]> = T extends [infer A, ...infer B]
? U extends [infer C, ...infer D]
? [[A, C], ...Zip<B, D>]
: []
: []
Solution by DragonnZhang #26162
// your answers
export type Zip<T extends readonly unknown[], U extends readonly unknown[]> = T extends
[infer TF, ...(infer TR)]
? U extends [infer UF, ...(infer UR)]
? TR extends [] ? [TF, UF] : UR extends [] ? [TF, UF] : [[TF, UF], Zip<TR, UR>]
: never
: never;
Solution by junkor-1011 #26111
type Longer<T extends Array<unknown>, K extends Array<unknown>> = K extends [infer Head1, ...infer Tail1]
? T extends [infer Head2, ...infer Tail2]
? Longer<Tail2, Tail1>
: false
: T extends []
? false
: true
type MakeZip<T extends Array<unknown>, U extends Array<unknown>, L extends number, R extends Array<unknown> = []> = L extends R['length']
? R
: MakeZip<T, U, L, [...R, [T[R['length']], U[R['length']]]]>
type Zip<T extends Array<unknown>, U extends Array<unknown>> = Longer<T, U> extends true
? MakeZip<T, U, U['length']>
: MakeZip<T, U, T['length']>;
Solution by yungo1846 #25636
// your answers
type Zip<T extends unknown[], U extends unknown[]> =
T extends [infer X, ...infer Y] ?
U extends [infer A, ...infer B] ? [[X, A], ...Zip<Y, B>] : [] :
[]
Solution by kiki-zjq #25228
Zip has a somewhat obvious solution that most people come up with without much trouble, but there's a way to refactor this solution into something beautiful. Even if you don't think this one has much to bring, I assure you you're gonna want to see one of these alternatives.
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type A1 = Zip<[], []>;
type B1 = []
type C1 = Expect<Equal<A1, B1>>;
type A2 = Zip<[1, 2], [true, false]>;
type B2 = [[1, true], [2, false]]
type C2 = Expect<Equal<A2, B2>>;
type A3 = Zip<[1, 2, 3], ['1', '2']>;
type B3 = [[1, '1'], [2, '2']]
type C3 = Expect<Equal<A3, B3>>;
type A4 = Zip<[], [1, 2, 3]>;
type B4 = []
type C4 = Expect<Equal<A4, B4>>;
type A5 = Zip<[[1, 2]], [3]>;
type B5 = [[[1, 2], 3]]
type C5 = Expect<Equal<A5, B5>>;
// ============= Your Code Here =============
type Zip<
T extends unknown[],
U extends unknown[]
> =
T extends [infer THead, ...infer TTail]
? U extends [infer UHead, ...infer UTail]
? [
[THead, UHead],
...Zip<TTail, UTail>
]
: []
: [];
// ============== Alternatives ==============
type Zip<
A extends unknown[],
B extends unknown[],
Acc extends unknown[] = []
> =
Acc['length'] extends A['length'] | B['length']
? Acc
: Zip<
A,
B,
[
...Acc,
[
A[Acc['length']],
B[Acc['length']]
]
]
>;
// beautiful!
type Zip<
T extends unknown[],
U extends unknown[]
> =
[T, U] extends [
[infer THead, ...infer TTail],
[infer UHead, ...infer UTail]
]
? [[THead, UHead], ...Zip<TTail, UTail>]
: [];
For more video solutions to other challenges: see the umbrella list! https://github.com/type-challenges/type-challenges/issues/21338
Solution by dimitropoulos #24327
type Zip<T extends unknown[], U extends unknown[]> = T extends [infer TFirst, ...infer TRest]
? U extends [infer UFirst, ...infer URest]
? [[TFirst, UFirst], ...Zip<TRest, URest>]
: []
: []
Solution by NeylonR #24267