JavaScript의 Array.includes 함수를 타입 시스템에서 구현하세요. 타입은 두 인수를 받고, true 또는 false를 반환해야 합니다.
type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'> // expected to be `false`
type을 2가지 방법으로 만들어보겠다.
배열의 모든 값을 하나씩 비교하는 것이다.
먼저 2개의 타입변수를 비교하는 제네릭을 만들겠다.
type Equals<X, Y> = X extends Y ? true : false;
이제 이를 이용하여 Includes타입을 만들어보겠다.
type Includes<T, U> = ??
여기서 T는 배열 타입이다. 그리고 그 배열에서 두 개를 추론할 것이다.
type Includes<T, U> = T extends [infer Current, ...infer Rest]
현재 다룰 값과 나머지 이렇게 추론한 후 아까 만든 Equals로 값을 비교할 것이다.
type Includes<T, U> = T extends [infer Current, ...infer Rest] ? Equals<Current, U> extends true ? true : Includes<Rest, U> : false;
비교하여 true인지 조건부를 통해 검사하여 true라면 true를 반환하고 아니라면 다시한번 나머지 값들을 다시 Includes로 검사한다. 만약 끝까지 false가 나온다면 false를 반환하게 되는 것이다.
아까와 달리 union 타입을 이용하여 조건부를 통해 검사할 것이다.
type Includes<T extends any[], U> = U extends T[number] ? true : false;