kakasoo

NTuple 타입 정의하기 본문

프로그래밍/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로 추론된다.

반응형