타입 챌린지 5317 - LastIndexOf

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

타입챌린지

목록 보기
74/131

문제 링크

문제

타입 버전의 Array.lastIndexOf를 구현하라. LastIndexOf<T, U>는 배열 T를 받고, any 형태의 U를 받는다. 그리고 배열 T에서 있는 U의 마지막 인덱스를 반환하라

Implement the type version of Array.lastIndexOf, LastIndexOf<T, U> takes an Array T, any U and returns the index of the last U in Array T

내 풀이

type LastIndexOfImplement<T extends any[],U,Result extends number=-1,Index extends any[]=[]>=
  T['length'] extends Index['length']?Result:
    Equal<T[Index['length']],U> extends true?
      LastIndexOfImplement<T,U,Index['length'],[...Index,1]>
      :LastIndexOfImplement<T,U,Result,[...Index,1]>

type LastIndexOf<T extends any[], U> = LastIndexOfImplement<T,U>

우선 사용처에서 구현용 제네릭을 사용하지 못하게 하기 위해 구현과 실제 타입을 분리했다.

일단 Index 배열을 증가시키며 T 배열을 순회하는 재귀 형태의 타입을 만들었다

만약 T[Index['length']]가 U와 동일하다면 (Eqaul 기준), Result를 Index['length']로 업데이트해 재귀를 진행한다.

Index['length']가 T['length']가 되면 Result를 반환한다.
가장 마지막에 있는 U와 같은 요소가 Result에 업데이트 되어 있을 것이므로, Result를 반환하면 되는 것이다.
이때, Index를 업데이트 하지 않았다면 -1이 기본값이므로 -1을 반환하게 된다.

다른 사람의 풀이

type LastIndexOf<T extends any[], U> = T extends [...infer I,infer L]? L extends U?I['length']: LastIndexOf<I,U> : -1;

해당 풀이

LastIndexOf가 마지막에 있는 U의 위치를 확인해야하는 것을 감안하여 spread 연산자를 이용한 풀이이다.
깔끔한 풀이인 것 같다.

참고자료

https://github.com/type-challenges/type-challenges/issues/5330

0개의 댓글