728x90
문제
Do you know lodash
? Chunk
is a very useful function in it, now let's implement it. Chunk<T, N>
accepts two required type parameters, the T
must be a tuple
, and the N
must be an integer >=1
type exp1 = Chunk<[1, 2, 3], 2> // expected to be [[1, 2], [3]]
type exp2 = Chunk<[1, 2, 3], 4> // expected to be [[1, 2, 3]]
type exp3 = Chunk<[1, 2, 3], 1> // expected to be [[1], [2], [3]]
cases
type cases = [
Expect<Equal<Chunk<[], 1>, []>>,
Expect<Equal<Chunk<[1, 2, 3], 1>, [[1], [2], [3]]>>,
Expect<Equal<Chunk<[1, 2, 3], 2>, [[1, 2], [3]]>>,
Expect<Equal<Chunk<[1, 2, 3, 4], 2>, [[1, 2], [3, 4]]>>,
Expect<Equal<Chunk<[1, 2, 3, 4], 5>, [[1, 2, 3, 4]]>>,
Expect<Equal<Chunk<[1, true, 2, false], 2>, [[1, true], [2, false]]>>,
]
풀이
조건
- T를 N 단위로 잘라 배열을 만든다.
- N 미만으로 남는 경우 하나의 배열로 만들어 마지막에 추가한다.
정답
type Chunk<T extends any[], N extends number, V extends any[] = []> =
V['length'] extends N ? [V, ...Chunk<T, N>]
: T extends [infer T1, ...infer RestT]
? Chunk<RestT, N, [...V, T1]>
: V extends [] ? V : [V]
해설
우선, N만큼의 길이를 가지는 배열 1개를 분리한다.
type Chunk<T extends any[], N extends number, V extends any[] = []> =
V['length'] extends N ? V
: T extends [infer T1, ...infer RestT]
? Chunk<RestT, N, [...V, T1]>
: any
N만큼의 길이를 가지는 배열을 가능한만큼 분리하도록 수정한다.
type Chunk<T extends any[], N extends number, V extends any[] = []> =
V['length'] extends N ? [V, ...Chunk<T, N>]
: T extends [infer T1, ...infer RestT]
? Chunk<RestT, N, [...V, T1]>
: any
자르고 남은 나머지 요소들을 하나의 배열로 넣어 마지막에 넣어 준다.
type Chunk<T extends any[], N extends number, V extends any[] = []> =
V['length'] extends N ? [V, ...Chunk<T, N>]
: T extends [infer T1, ...infer RestT]
? Chunk<RestT, N, [...V, T1]>
: [V]
마지막으로 V 가 빈 배열인 경우를 처리한다.
type Chunk<T extends any[], N extends number, V extends any[] = []> =
V['length'] extends N ? [V, ...Chunk<T, N>]
: T extends [infer T1, ...infer RestT]
? Chunk<RestT, N, [...V, T1]>
: V extends [] ? V : [V]
혹시 글에 오류나 개선에 대한 피드백이 있다면 부담없이 댓글 부탁드립니다!
728x90