일반 자바스크립트 함수 Fill을 타입으로 구현하라
당신이 볼 수 있듯이, Fill<T, N, Start?, End?>은 Fill은 4가지 인자를 받습니다.
T와 N은 필수 인자이며, Start와 End는 옵셔널 인자입니다. 이러한 인자를 위한 요구사항은 다음과 같습니다:
T는 튜플입니다. N은 any 타입입니다. Start와 End는 0 이상의 정수입니다.
Fill, a common JavaScript function, now let us implement it with types. Fill<T, N, Start?, End?>, as you can see,Fill accepts four types of parameters, of which T and N are required parameters, and Start and End are optional parameters. The requirements for these parameters are: T must be a tuple, N can be any type of value, Start and End must be integers greater than or equal to 0.
type FillImplement<
T extends unknown[],
N,
Start extends number = 0,
End extends number = T['length'],
Result extends unknown[]=[],
Flag extends boolean=false
> =
T['length'] extends Result['length']?Result
:Result['length'] extends End?
FillImplement<T,N,Start,End,[...Result,T[Result['length']]],false>
:Result['length'] extends Start?
FillImplement<T,N,Start,End,[...Result,N],true>
:Flag extends true?
FillImplement<T,N,Start,End,[...Result,N],true>
:FillImplement<T,N,Start,End,[...Result,T[Result['length']]],false>
type Fill<
T extends unknown[],
N,
Start extends number = 0,
End extends number = T['length'],
> =FillImplement<T,N,Start,End>
배열을 활용한 재귀 타입문제이다.
우선 사용처에서 Result를 사용하지 못하게 구현 타입을 분리했다.
타입을 도출하는 과정은 다음과 같다.