배열을 depth회까지 평탄화하라
Recursively flatten array up to depth times.
type FlattenDepthImplement<T extends any[],MaxDepth extends number,DepthArr extends any[]=[]> =
MaxDepth extends DepthArr['length']?T
:T extends [infer First, ...infer Rest]?
[...(First extends any[]?
FlattenDepthImplement<First,MaxDepth,[...DepthArr,1]>
:[First])
,...FlattenDepthImplement<Rest,MaxDepth,DepthArr>]
:[]
type FlattenDepth<T extends any[],MaxDepth extends number=1>=FlattenDepthImplement<T,MaxDepth>
사용처에서 DepthArr 제네릭 사용을 제한하기 위해 FlattenDepthImplement을 구현했다.
배열을 분해하기 위해 First의 타입을 조사 후, 배열이라면 재귀적으로 넣어주고, 배열이 아니라면 해당 값을 배열로 감싸주어 spread연산자를 사용했다.
type FlattenOnce<T extends any[], U extends any[] = []> = T extends [infer X, ...infer Y] ? (
X extends any[] ? FlattenOnce<Y, [...U, ...X]> : FlattenOnce<Y, [...U, X]>
) : U
type FlattenDepth<
T extends any[],
U extends number = 1,
P extends any[] = []
> = P['length'] extends U ? T : (
FlattenOnce<T> extends T ? T : (
FlattenDepth<FlattenOnce<T>, U, [...P, any]>
)
)
FlattenOnce라는 것을 이용해 T를 1회 flatten을 해준 후,
그 값이 T와 같다면 T가 이미 flatten 된 값이기 때문에 바로 반환하고,
그렇지 않다면 FlattenOnce한 값을 다시 FlattenDepth에 넣어준다.
https://github.com/type-challenges/type-challenges/issues/14088