타입챌린지 Includes

Yoomin Kang·2023년 12월 9일
post-thumbnail

문제 보기

JavaScript의 Array.includes 함수를 타입 시스템에서 구현하세요. 타입은 두 인수를 받고, true 또는 false를 반환해야 합니다.
예시:

type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'> // expected to be `false`

처음 생각한 방법은 간단했습니다.

type Includes<T extends readonly any[], U> = U extends T[number] ? true : false

그러나 위 코드는 몇 가지 반례에 걸렸습니다.

<[boolean, 2, 3, 5, 6, 7], false>

와 같이 false가 나와야할 테스트케이스에 true가 나와버린 것이죠.

이렇게 접근하면 안 된다는 것을 깨닫고 방향을 돌렸습니다.

infer을 써보자!

튜플에서 첫 요소를 하나씩 infer로 가져와 U와 비교하고(@type-challenges/utils에서 기본적으로 import되어 있는 Equal 사용 또는 직접 구현), 재귀적으로 반복하면 해결됩니다.

정답 코드:

type Includes<T extends readonly any[], U> =
  T extends [infer P, ...infer Rest] ?
    Equal<P, U> extends true ? true : Includes<Rest, U>
    : false 
profile
FE Developer @Toss | GSHS 36 | Korea Univ 21

0개의 댓글