
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