FE/type-challenge
5317. LastIndexOf
최토피
2023. 8. 21. 12:36
728x90
문제
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 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
풀이
조건
- 가장 마지막 요소를 반환한다.
해설
뒤에서부터 재귀적으로 검사한다. 만약 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