type-challenges
type-challenges copied to clipboard
459 - Flatten
// 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
666
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
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
type Flatten<T extends any[]> = T extends [] ? [] : T extends [infer First, ...infer Rest] ? First extends any[] ? [...Flatten<First>, ...Flatten<Rest>] : [First, ...Flatten<Rest>] : never;
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
type Flatten<A extends unknown[]> = A extends [infer H, ...infer R]
? [...(H extends unknown[] ? Flatten<H> : [H]), ...Flatten<R>]
: [];
// 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
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>]
: [];
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
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
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[] = []>
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;
type Flatten<T extends any[]> = T extends [infer l, ...infer r]
? l extends any[]
? [...Flatten<l>, ...Flatten<r>]
: [l, ...Flatten<r>]
: [];
type Flatten<T extends any[]> = T extends [infer F, ...infer R]
? F extends any[]
? Flatten<[...F, ...R]>
: [F, ...Flatten<R>]
: T
// 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;
type Flatten<T extends readonly any[]> = {[I in keyof T]: T[I] extends any[] ? Flatten<[...T, T[I]]> : T[I]}
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