00459-medium-flatten

Back

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

// 思路:从左往右依次铺平第一个元素,每次递归数组外剩余部分[T[0], Flatten<T[Rest]>]
type Flatten<T extends any[]> = T extends [infer F, ...infer Rest]
 ? F extends any[] 
   ? [...F, ...Flatten<Rest>]
   : [F, ...Flatten<Rest>]
 : [...T]


 // Expect<Equal<Flatten<[1, 2, [3, 4], [[[5]]]]>, [1, 2, 3, 4, 5]>> 
 // 该断言不过,数组每个元素可能是嵌套数组,需要对第一个元素进行多次铺平 Flatten<[...F, ...Rest]
 type Flatten<T extends any[]> = T extends [infer F, ...infer Rest]
 ? F extends any[] 
   ? [...Flatten<[...F, ...Rest]>]
   : [F, ...Flatten<Rest>]
 : [...T]

Solution by ScriptBloom #33910

459 - Flatten

by zhouyiming (@chbro) #medium #array

Question

In this challenge, you would need to write a type that takes an array and emitted the flatten array type.

For example:

type flatten = Flatten<[1, 2, [3, 4], [[[5]]]]> // [1, 2, 3, 4, 5]

View on GitHub: https://tsch.js.org/459

...

type Flatten<A extends readonly unknown[]> = A extends [infer L, ...infer R]
  ? L extends unknown[]
    ? [...Flatten<L>, ...Flatten<R>]
    : [L, ...Flatten<R>]
  : A

Solution by veralex #33784

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

Solution by rookiewxy #33734

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

方案二:
type Flatten<T extends any[], R extends any[] = []> = T extends [infer A, ...infer L] ? A extends any[] ?  Flatten<[...A, ...L], [...R]>: Flatten<L, [...R, A]> : R

Solution by heyuelan #33663

// 你的答案
type Flatten<T extends unknown[], U extends unknown[] = []> = T extends [infer H, ...infer R] ? H extends unknown[] ? [...Flatten<H, [...U]>, ...Flatten<R>] : Flatten<R, [...U, H]> : U;

Solution by HelloGGG #33413

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

Solution by ZhipengYang0605 #32826

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

Solution by Leen27 #32804

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

Solution by dev-hobin #32403

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

Solution by nivenice #32394

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

Solution by shuxiaoduo #32204

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

Solution by pea-sys #32160

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

Solution by jinyoung234 #31738

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

Solution by kai-phan #31642

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

Solution by SazonovV #31332

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

Solution by eward957 #31245

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

Solution by zyh-ultra #31142

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

Solution by Minato1123 #31094