04471-medium-zip

Back

// 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

4471 - Zip

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.

🎥 Video Explanation

Release Date: 2023-03-08 19:00 UTC

Zip

🔢 Code

// ============= 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>]
  : [];

➕ More Solutions

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