00459-medium-flatten

Back

type Flatten<A extends any[], Acc extends any [] = []> = 
  A extends [infer F, ...infer R]
      ? F extends any[]
        ? Flatten<R, [...Acc, ...Flatten<F>]>
        : Flatten<R, [...Acc, F]>
      : Acc

Solution by ssviaam #38410

type Flatten<T extends any[], S extends any[] = []> =
  T extends [infer X, ...infer Y]
  ? X extends any[]
  ? Flatten<[...X, ...Y], S>
  : Flatten<[...Y], [...S, X]>
  : S

Solution by VarunMendre #38372

// your answers
type Flatten<T extends any[]> = T extends [infer L, ...infer R] ? L extends any[] ? [...Flatten<L>, ...Flatten<R>] : [L, ...Flatten<R>] : []

Solution by Lean-Young #38183

// 你的答案

type Flatten<T extends unknown[], U extends unknown[] = []> = T extends [infer F, ...infer R] ? (F extends unknown[] ? Flatten<[...F, ...R], U> : Flatten<R, [...U, F]>) : U

Solution by dong-hx #38037

type Flatten<T extends any[]> = T extends [infer First, ...infer Rest]
  ? First extends any[]
    ? [...Flatten<First>, ...Flatten<Rest>]
    : [First, ...Flatten<Rest>]
  : []

Solution by LovePlayCode #37966

Tail Call Optimization TypeScript imposes a limit on recursion depth (typically around 50 to 100 levels). If an array is extremely deeply nested, it may trigger the 'Type instantiation is excessively deep and possibly infinite' error.

type Flatten<T extends readonly any[], Acc extends any[] = []> = 
  T extends [infer First, ...infer Left]
    ? First extends readonly any[]
      ? Flatten<[...First, ...Left], Acc>
      : Flatten<Left, [...Acc, First]>
    : Acc;

Solution by LittleBlacky #37887

type Flatten<T extends any[]> = T extends [infer P, ...infer M]
  ? P extends any[]
    ? [...Flatten<P>, ...Flatten<M>]
    : [P, ...Flatten<M>]
  : []

Solution by yukinotech #37877

type Flatten<S extends any[], T extends any[] = []> =  S extends [infer X, ...infer Y] ? 
  X extends any[] ?
   Flatten<[...X, ...Y], T> : Flatten<[...Y], [...T, X]> 
  : T

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Flatten<[]>, []>>,
  Expect<Equal<Flatten<[1, 2, 3, 4]>, [1, 2, 3, 4]>>,
  Expect<Equal<Flatten<[1, [2]]>, [1, 2]>>,
  Expect<Equal<Flatten<[1, 2, [3, 4], [[[5]]]]>, [1, 2, 3, 4, 5]>>,
  Expect<Equal<Flatten<[{ foo: 'bar', 2: 10 }, 'foobar']>, [{ foo: 'bar', 2: 10 }, 'foobar']>>,
]

Solution by AnastasiaSv #37477

type Flatten<T extends any[]> =
  T extends [infer First, ...infer Tail]
  ? First extends unknown[]
    ? [...Flatten<First>, ...Flatten<Tail>]
    : [First, ...Flatten<Tail>]
  : T;
  1. 泛型 R 存储递归最终结果
  2. 如果第一项 First 是数组,展开一层,继续递归
  3. 如果 First 不是数组,则加入到结果中,Tail 继续 Flatten 递归

Solution by djdidi #37159

type Flatten<T extends any[], Count extends any[] = []> = T extends [infer F, ...infer R] ? F extends any[] ? [...Flatten<F>, ...Flatten<R>] : [F, ...Flatten<R>] : []

Solution by 359Steve #37065

// your answers
type Flatten<Arr extends any[], Res extends any[] = []> = Arr['length'] extends 0 ? Res
  : Arr extends [infer F, ...infer L] ? F extends any[] ? Flatten<[...Res, ... F, ...L], []> : Flatten<L, [...Res, F]> : never;

Solution by AlexBraunMagic #36931

type Flatten<T extends unknown[]> = T extends [infer Head, ...infer Tail] ? Head extends unknown[] ? [...Flatten, ...Flatten] : [Head, ...Flatten] : []

Solution by asylbekduldiev #36775

type Flatten<T extends any[], R extends any[] = []> = T extends [infer F, ...infer L] ?
  F extends any[] ? Flatten<[...F, ...L], R> : Flatten<[...L], [...R, F]> 
  : R

Solution by tungulin #36755

// your answers
type Flatten<T extends any[]> = 
  T extends [infer First, ...infer Rest] 
    ? First extends any[] ? [...Flatten<First>, ...Flatten<Rest>] : [First, ...Flatten<Rest>]
    : []

Solution by duanlvxin #36510

type Flatten<T extends any[]> = 
  T extends [infer F, ...infer R] 
    ? F extends any[]
        ? Flatten<[...F, ...R]>
        : [F, ...Flatten<R>]
    : T

Solution by AleksandrShcherbackov #36171

type Flatten<T extends any[]> = T extends [infer F, ...infer Rest]
  ? F extends any[]
  ? [...Flatten<F>, ...Flatten<Rest>]
  : [F, ...Flatten<Rest>]
  : []

Solution by user-9902 #36057

type Flatten<T extends any[]> = T extends [infer U,...infer P] ?  U extends any[] ? [...Flatten<U>,...Flatten<P>] :  [U,...Flatten<P>] : [];

Solution by tac-tac-go #35901

type Flatten<S extends any[], T extends any[] = []> =  S extends [infer X, ...infer Y] ? 
  X extends any[] ?
   Flatten<[...X, ...Y], T> : Flatten<[...Y], [...T, X]> 
  : T

Solution by adultlee #35830

We need a generic type T to store temporary array during inferance, First, we extracting first element F in Arr, if it is an array, we destructure it and recursively process all its elements, if it is not an array, we recursively process the remaining elements, if neither condition is met, we return an empty array.

type Flatten<Arr extends any[], T extends any[] = []> = Arr extends [infer F, ...infer Rest] 
  ? F extends any[] 
  ? Flatten<[...F, ...Rest], [...T]> 
  : Flatten<Rest, [...T, F]> 
  : T;

Solution by vaclock #35801

type Flatten<T extends Array<unknown>> = 
  T extends [infer First, ...infer Rest] 
  ? First extends Array<unknown> 
    ? [...Flatten<First>, ...Flatten<Rest>] 
    : [First, ...Flatten<Rest>] 
  : T

Solution by gangnamssal #35580

type Flatten<T extends unknown[], A extends unknown[] = []> = T extends [
  infer First,
  ...infer Last
]
  ? First extends unknown[]
    ? Flatten<[...First, ...Last], A>
    : Flatten<[...Last], [...A, First]>
  : A;

Solution by RanungPark #35518

// your answers
type Flatten<T> = T extends [infer First, ...infer Child]
    ? First extends any[]
        ? [...Flatten<First>, ...Flatten<Child>]
        : [First, ...Flatten<Child>]
    : [];

Solution by Sathiyapramod #35504

type Flatten<T extends any[]> = T extends [infer F, ...infer R]
    ? F extends any[]
        ? [...Flatten<F>, ...Flatten<R>]
        : [F, ...Flatten<R>]
    : []

Solution by HrOkiG2 #35250

type Flatten<T extends any[]> = T extends [infer First, ...infer Rest] ?
  First extends any[] ? [...Flatten<First>, ...Flatten<Rest>]
  : [First, ...Flatten<Rest>]
  : []

Solution by eunsukimme #35230

type Flatten<T extends any[], A extends any[] = []> = T extends [infer F, ...infer Rest]
  ? F extends any[]
    ? Flatten<[...F, ...Rest], A>
    : Flatten<Rest, [...A, F]>
  : A;

Solution by wendao-liu #35219

// 你的答案
type Flatten<T extends any[]> = T extends [infer A, ...infer Rest]
  ? A extends []
    ? A
    : A extends any[]
    ? Flatten<[...A, Rest]>
    : [A, ...Flatten<Rest>]
  : T;

Solution by shx123qwe #34967

type Flatten<T extends unknown[]> = T extends [infer First,...infer Rest] ? First extends unknown[] ? [...Flatten<First>,...Flatten<Rest>] : [First,...Flatten<Rest>]  : T

Solution by devshinthant #34592

type Flatten<T extends any[]> =
    T extends [infer A, ...infer R] ?
        [...(A extends any[] ? Flatten<A> : [A]), ...Flatten<R>] :
        [];

Solution by cipak #34590

// 你的答案


type Flatten<T extends any[],R extends any[] = []> = 
T extends [infer A,...infer B] ? 
A extends any[]? Flatten<[...A,...B],R>: Flatten<B,[...R,A]>
: R


Solution by Jayce-liang #34228

type Flatten<T extends any[], U extends any[] = []> = T extends [infer K, ...infer rest] ? (K extends any[] ? Flatten<rest, Flatten<K, U>> : Flatten<rest, [...U, K]>) : U

Solution by ouzexi #34015