jaenny.dev
article thumbnail

문제

배열을 받아, 배열을 평탄화하여 반환하시오.

 

예제:

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;
profile

jaenny.dev

@jaenny.dev

Go Beyond! Front-end developer, jaenny✨