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
by zhouyiming (@chbro) #medium #array
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