✍ 공부/TypeScript
[type-challenges] Flatten
Po_tta_tt0
2023. 6. 26. 09:03
반응형
문제
주어진 배열을 플랫한 배열 타입으로 바꾸는 Flatten 타입을 구현하세요.
설명
/* _____________ Your Code Here _____________ */
type Flatten<T,S extends any[] =[]> = T extends [any:infer K, ...a: infer P] ? K extends any[] ? Flatten<[...K,...P],S> : Flatten<[...P],[...S,K]> :S
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Flatten<[]>, []>>,
Expect<Equal<Flatten<[1, 2, 3, 4]>, [1, 2, 3, 4]>>,
Expect<Equal<Flatten<[1, [2]]>, [1, 2]>>,
Expect<Equal<Flatten<[1, 2, [3, 4], [[[5]]]]>, [1, 2, 3, 4, 5]>>,
Expect<Equal<Flatten<[{ foo: 'bar'; 2: 10 }, 'foobar']>, [{ foo: 'bar'; 2: 10 }, 'foobar']>>,
]
// @ts-expect-error
type error = Flatten<'1'>
바로 전 문제랑 아이디어가 비슷하다.
- T라는 배열을 0번째 배열과 나머지 배열로 분리한다
T extends [any:infer K, ...a: infer P]
- 분리가 되면 0번째 배열(K)가 플랫하지 않은 배열인지 (ex
[[3]]
) 확인한다 - 플랫하지 않은 배열일 경우
- 0번째 배열을 spread연산으로 풀어준다. 또 나머지 배열도 풀어준다
[...k, ...P]
- 두번째 인자로는 지금까지 만들어진 S를 넣어준다
- =>
Flatten<[...K,...P],S>
- 0번째 배열을 spread연산으로 풀어준다. 또 나머지 배열도 풀어준다
- 플랫한 배열일 경우
- K를 따로 풀어줄 필요가 없으므로 다음 Flatten의 T로 spread 연산으로 풀어준 P만 넣어준다
- S에 플랫한 K를 추가해준다
- T가
[any:infer K, ...a: infer P]
를 extend하지 않을 경우: 내용물이 텅텅 빌 경우 재귀를 통해 만들어진 S를 찍는다
반응형