
타입스크립트에서 두 타입이 같은지 검사하는 유틸리티 타입은 내장되어 있지 않습니다.
어떻게 구현할 수 있을까요?
제가 처음에 생각한 방식은 이렇습니다.
type Equal<T, U> = T extends U ? U extends T ? true : false : false
그러나 이런 경우 Equal<1, 1|2>에서 false가 아닌 boolean으로 추론되는 반례가 있습니다.
이는 Distributive Conditional Types 때문인데, Equal<1, 1|2>를 Equal<1, 1> | Equal<1, 2>로 분배하여 결국 boolean으로 추론되는 것이죠.
이러한 문제는 함수로 해결할 수 있습니다. Type Challenge에서 내장된 Equal을 구현한 방식을 살펴보면 다음과 같습니다.
type Equal<X, Y> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? true : false
끝!