Rozwiązanie z komentarzem
Opublikowano 18 września 2026Rozwiązanie
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]>
Najczęstsza błędna odpowiedź
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]>
Oba testy są dobre; kolejność nie. Gdy `A` i `B` są równe, licznik dochodzi do nich w tym samym kroku i wygrywa to pytanie, które zadano pierwsze. Pytanie najpierw o `B` daje `true` dla `GreaterThan<2, 2>` — równe jest raportowane jako większe, a ujawnia to wyłącznie przypadek równości.
Linia po linii
C['length'] extends A ? falseOsiągnięcie najpierw `A` oznacza, że `B` jest co najmniej tak duże, więc `A` nie może być ostro większe. Umieszczenie tej gałęzi jako pierwszej czyni porównanie ostrym, a nie „większe lub równe”.
[...C, unknown]Jedno kliknięcie licznika. Krotki nikt nie czyta — czytana jest tylko jej długość — więc to najtańszy możliwy sposób trzymania liczby, którą da się zwiększyć o jeden.
GreaterThan<0, 5>Licznik startuje od zera, więc rozstrzyga się to, zanim padnie choć jeden krok: `A` zostaje osiągnięte natychmiast i odpowiedzią jest `false`.
Do zapamiętania
Gdy dwa warunki mogą zadziałać w tym samym kroku, ich kolejność jest specyfikacją. Typy porównujące są niemal zawsze poprawne w przypadkach nierównych i błędne przy remisie.

