Equal
두 타입이 동일하다는 것을 판단하는 방법도 알아보겠습니다. 타입도 집합이므로 A가 B의 부분집합이고 B도 A의 부분집합이면, 집합 A와 B가 서로 동일하다는 뜻이겠죠? 이를 곧이곧대로 코드로 나타내면 다음과 같습니다.
type Equal<A, B> = A extends B ? B extends A ? true : false : false;
이 코드에는 허점이 있습니다. 다음 예제들은 true가 될 것으로 예상했으나 그렇지 않은 사례들입니다.
type R1 = Equal<boolean, true | false>;
// type R1 = boolean
type R2 = Equal<never, never>;
// type R2 = never
이유는 이전 장에서 배웠습니다. boolean이나 never는 유니언이므로 분배법칙이 발생하기 때문입니다. 따라서 분배법칙이 일어나지 않게 바꾸면 됩니다.
type Equal<A, B> = [A] extends [B] ? [B] extends [A] ? true : false : false;