더북(TheBook)

다만 이 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에 실제 타입을 넣어보아야 합니다.

일단 XY가 같은 타입이면 Equal2<X, Y>true가 됩니다. X == Y인 상황에서 (<T>() => T extends X ? 1 : 2) 타입은 (<T>() => T extends Y ? 1 : 2) 타입과 동일하므로 extends할 수 있기 때문입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.