타입 버전의 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