この U1 and U2 are identical types (=U1とU2が一致する)という定義が重要で、このU1とU2にそれぞれ等価判定をしたいXとYを代入して、かつ他の条件を必ず満たすようにすれば、型の等価判定が実現できる。 ではなぜ<T>() => (T extends X ? 1 : 2)のような定義になってるかというと、これは「遅延評価のため」と述べられている。 Equal<X,Y> の実装に必要なのは Conditional Types 同士の比較なのだが、通常 Conditional Types は簡約されるため、Conditional Types 同士の比較になることは少ない。 T extends X ? 1 : 2 の評価をする際、Tは必ず未定である(この定義ではどの段階においてもTが具体的に決まることはない)。コンパイラは Conditional Types (T