문제
배열을 받아, 배열을 평탄화하여 반환하시오.
예제:
type flatten = Flatten<[1, 2, [3, 4], [[[5]]]]> // [1, 2, 3, 4, 5]
풀이
제네릭 타입으로 배열을 받아야 하니 T extends any[]
로 배열만 받도록 제한해 줍니다.
infer와 spread를 사용해서 T 배열의 첫 원소를 First로 가져옵니다.
만약 빈 배열이라면 First로 가져올 수 없으니 바로 T를 리턴해줍니다.
그런데 지금 구현하려는 Flatten은 1 depth만 평탄화하는 것이 아니고, 모든 배열을 평탄화해야 합니다.
따라서 재귀로 구현해 줄 것입니다.
First가 배열이 아니여서, 더 이상 평탄화가 필요없는 경우부터 생각해줍니다.
First가 배열이 아니라면, 리턴하려는 배열의 첫 번째 자리에 두고, 나머지 원소들을 확인하기 위해 다시 Flatten의 인자로 넣어줍니다.
First가 배열이라면, First도 Flatten 해줘야 하고 나머지 원소들도 Flatten 해주면 됩니다.
정답 코드
type Flatten<T extends any[]> = T extends [infer First, ...infer Rest]
? First extends any[]
? [...Flatten<First>, ...Flatten<Rest>]
: [First, ...Flatten<Rest>]
: T;
'Frontend' 카테고리의 다른 글
자바스크립트 가비지 컬렉팅(GC) 어디까지 알고있나? (1) | 2023.12.15 |
---|---|
자바스크립트 V8 엔진의 메모리 구조와 사용 (0) | 2023.12.15 |
-Like 타입은 뭘까? Array vs. ArrayLike / Promise vs. PromiseLike (0) | 2023.01.24 |