Solución comentada
Publicado el 18 de septiembre de 2026La solución
type GreaterThan<A extends number, B extends number, C extends unknown[] = []> = C['length'] extends A ? false : C['length'] extends B ? true : GreaterThan<A, B, [...C, unknown]>
El error más común
type GreaterThan<A extends number, B extends number, C extends unknown[] = []> = C['length'] extends B ? true : C['length'] extends A ? false : GreaterThan<A, B, [...C, unknown]>
Ambas pruebas son correctas; el orden no. Cuando `A` y `B` son iguales el contador llega a ambos en el mismo paso, y gana la pregunta que se hace primero. Preguntar primero por `B` responde `true` a `GreaterThan<2, 2>` — lo igual se informa como mayor, y solo el caso de igualdad llega a delatarlo.
Línea por línea
C['length'] extends A ? falseLlegar antes a `A` significa que `B` es al menos igual de grande, así que `A` no puede ser estrictamente mayor. Poner esta rama primero es lo que hace que la comparación sea estricta y no «mayor o igual».
[...C, unknown]Un tic del contador. La tupla nunca se lee — solo su longitud — así que es la forma más barata posible de sostener un número que puede subir de uno en uno.
GreaterThan<0, 5>El contador arranca en cero, así que esto se decide antes de dar un solo paso: se alcanza `A` de inmediato y la respuesta es `false`.
Para recordar
Cuando dos condiciones pueden dispararse en el mismo paso, su orden es la especificación. Los tipos de comparación casi siempre aciertan en los casos desiguales y fallan en el empate.

