FE/type-challenge

5317. LastIndexOf

최토피 2023. 8. 21. 12:36
728x90

문제

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

type Res1 = LastIndexOf<[1, 2, 3, 2, 1], 2> // 3
type Res2 = LastIndexOf<[0, 0, 0], 2> // -1

cases

type cases = [
  Expect<Equal<LastIndexOf<[1, 2, 3, 2, 1], 2>, 3>>,
  Expect<Equal<LastIndexOf<[2, 6, 3, 8, 4, 1, 7, 3, 9], 3>, 7>>,
  Expect<Equal<LastIndexOf<[0, 0, 0], 2>, -1>>,
  Expect<Equal<LastIndexOf<[string, 2, number, 'a', number, 1], number>, 4>>,
  Expect<Equal<LastIndexOf<[string, any, 1, number, 'a', any, 1], any>, 5>>,
]

문제 링크

정답

type IsEqual<T, U> = U extends T ? T extends U ? true : false : false

type LastIndexOf<T, U>
    = T extends [...infer Rest, infer TL]
      ? IsEqual<TL, U> extends true
        ? Rest['length']
        : LastIndexOf<Rest, U>
      : -1

풀이

조건

  1. 가장 마지막 요소를 반환한다.

해설

뒤에서부터 재귀적으로 검사한다. 만약 U를 찾는다면 위치값을 length를 이용해 반환한다.

type LastIndexOf<T, U> = T extends [...infer Rest, infer TL]
	? LastIndexOf<Rest, U>
		? TL extends U
      ? Rest['length']
      : LastIndexOf<Rest, U>
    : -1

number, any와 같은 경우 오류가 발생하므로, 이를 보완한다.

type IsEqual<T, U> = U extends T ? T extends U ? true : false : false

type LastIndexOf<T, U>
    = T extends [...infer Rest, infer TL]
      ? IsEqual<TL, U> extends true
        ? Rest['length']
        : LastIndexOf<Rest, U>
      : -1

오류가 있다면 댓글 부탁드리겠습니다.

728x90