타입 챌린지 4518 - Fill

소파의 벨로그·2025년 4월 28일

타입챌린지

목록 보기
68/131

문제 링크

문제

일반 자바스크립트 함수 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를 사용하지 못하게 구현 타입을 분리했다.

타입을 도출하는 과정은 다음과 같다.

  1. 만약 Result와 T의 length가 같다면 Result를 반환한다.
  2. Result의 length가 End와 같다면 flag를 flase로 바꾸고 Result의 원래 T의 값을 넣은뒤 재귀적으로 넘어간다
  3. Result의 length가 Start와 같다면 flag를 true로 바꾸고 Result에 N으로 넣은 후 재귀적으로 넘어간다
  4. Flag가 true면 Result에 N으로 넣고, Flag가 false이면 Result에 원래 T의 값을 넣은 뒤 재귀적으로 넘어간다.

0개의 댓글