프로그래밍/TypeScript
NTuple 타입 정의하기
카카수(kakasoo)
2023. 1. 21. 22:48
반응형
이 글에 나와 있는 Push Type은 이전 글에서 설명하고 있다.
type NTuple<N, T> = ?
타입 N 튜플은 타입 파라미터 N을 튜플의 크기로 하는 Tuple 타입을 의미한다.
두번째 파라미터로 받은 T는, 튜플에 포함되어 있어야 하는 값이 있는 경우, 값을 정의하기 위해 존재한다.
이 NTuple을 정의하려면 어떻게 해야 할까?
type NTuple<N extends number, T extends any[] = []> = ?
일단 N은 number를, T는 any[]를 확장해주어야 한다.
T의 경우 기본 타입으로 빈 배열 ( 여기서는 튜플이라고 하는 게 정확하다 ) 을 받는다.
파라미터를 받았으니 이제 구현 부분이다.
구현을 위해서는 튜플 타입이 의미하는 게 무엇인지, 논리를 하나 씩 따져보는 것이 좋을 것이다.
type NTuple<N extends number, T extends any[] = []> = T['length'] extends N ? T : NTuple<N, Push<T, any>>;
T는 미리 받은 배열 또는 빈 배열로 정의된다.
따라서 NTuple은 T의 length가 이미 N과 일치할 경우, 미리 받았던 배열 T를 튜플 형태로 돌려주기만 하면 된다.
만약 T의 length가 N과 다르다면 NTuple<N, Push<T, any>> 를 재귀적으로 반환하면 된다.
NTuple<N, Push<T, any>>의 의미는, 결과적으로, 배열의 Length가 일치할 때까지 any를 넣은 튜플이 된다.
만약 T의 타입 파라미터로 받은 값이 처음에 정한 N보다 큰 length를 가지게 지정될 경우에는 타입이 any가 된다.
무한히 any가 있는 튜플은 곧 any[]일 것이고, any[]는 any로 추론된다.
반응형