다만 이 Equal 타입은 any와 다른 타입을 구별하지 못합니다.
type R3 = Equal<any, 1>;
// type R3 = true
type R4 = Equal<[any], [number]>;
// type R4 = true
any와 다른 타입을 구별하려면 Equal 타입을 다음과 같이 만들면 됩니다.
type Equal2<X, Y>
= (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2)
? true
: false
한 번에 이해하기 어려운 코드입니다. 좀 더 설명하면, 이 코드의 뜻은 (<T>() => T extends X ? 1 : 2) 타입을 (<T>() => T extends Y ? 1 : 2) 타입에 대입할 수 있는지 묻는 것입니다. 왜 이것이 Equal을 의미하는지 알기 위해서는 X, Y에 실제 타입을 넣어보아야 합니다.
일단 X랑 Y가 같은 타입이면 Equal2<X, Y>는 true가 됩니다. X == Y인 상황에서 (<T>() => T extends X ? 1 : 2) 타입은 (<T>() => T extends Y ? 1 : 2) 타입과 동일하므로 extends할 수 있기 때문입니다.