type-challenges icon indicating copy to clipboard operation
type-challenges copied to clipboard

459 - Flatten

Open pokuwagata opened this issue 4 years ago • 14 comments
trafficstars

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

pokuwagata avatar Apr 21 '21 13:04 pokuwagata

666

Mario-Marion avatar Jun 10 '23 13:06 Mario-Marion

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

my answer is complex,yours is great, clever

ydaydayup avatar Sep 09 '23 08:09 ydaydayup

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

GBVFtou avatar Nov 11 '23 15:11 GBVFtou

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

PKozyakSoftonix avatar Nov 15 '23 11:11 PKozyakSoftonix

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

Nikjee avatar Dec 04 '23 10:12 Nikjee

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

ChibiBlasphem avatar Dec 15 '23 02:12 ChibiBlasphem

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

[...Y] can change directly to Y

Qzhor avatar Jan 07 '24 13:01 Qzhor

no need for two arguments

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

ivannovazzi avatar Jan 07 '24 16:01 ivannovazzi

one argument also works.

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

w2xi avatar Jul 02 '24 05:07 w2xi

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

Zhang-Lu-Bin avatar Jul 30 '24 10:07 Zhang-Lu-Bin

Below is my answer, tested and it is working fine.

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

Anyone please help explain the answer which the writer provided, I didn't understand why there is an extra T there. Flatten<S extends any[], T extends any[] = []>

likepeach789 avatar Aug 22 '24 07:08 likepeach789

type Flatten<T extends unknown[], R extends unknown[] = []> = T extends [
  infer D,
  ...infer L,
]
  ? Flatten<L, D extends [...infer DD] ? Flatten<DD, R> : [...R, D]>
  : R;

lewton avatar Aug 24 '24 09:08 lewton

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

tanliyuan avatar Sep 29 '24 10:09 tanliyuan

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

linkinzhiyuan avatar Oct 29 '24 05:10 linkinzhiyuan

// your answers
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
type Flatten<T extends any[]> = T extends [infer A, ...infer Rest]
  ? A extends []
    ? A
    : A extends any[]
    ? Flatten<[...A, Rest]>
    : [A, ...Flatten<Rest>]
  : T;

shx123qwe avatar Nov 05 '24 17:11 shx123qwe

type Flatten<T extends readonly any[]> = {[I in keyof T]: T[I] extends any[] ? Flatten<[...T, T[I]]> : T[I]}

michael-komeet avatar Mar 26 '25 06:03 michael-komeet

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

ernestpluta avatar Jun 17 '25 21:06 ernestpluta