Rozwiązanie z komentarzem
Opublikowano 8 sierpnia 2026Rozwiązanie
type Permutation<T, K = T> = [T] extends [never] ? [] : K extends K ? [K, ...Permutation<Exclude<T, K>>] : never
Najczęstsza błędna odpowiedź
type Permutation<T> = T extends T ? [T] : neverTo rozdziela się i owija każdy element we własną krotkę, dając ["a"] | ["b"] — każdy element osobno, nigdy razem. Dla never odpowiada też never, bo dystrybucja po pustej unii nie daje nic zamiast pustej krotki.
Linia po linii
[T] extends [never]Owinięcie w krotkę tłumi dystrybucję, co jest tu kluczowe: warunek dystrybutywny nad
neverdajeneveri przypadek bazowy nigdy by nie nastąpił.K extends KWarunek trywialnie prawdziwy, użyty wyłącznie dla efektu ubocznego: rozdziela
K, więc gałąź poniżej wykonuje się raz na element unii.Kdomyślnie równa sięT, zachowując nietkniętą kopię, gdyTjest zawężane przezExclude.
Do zapamiętania
K extends K to idiom „rozdziel tę unię”, a [T] extends [never] — „nie rozdzielaj”. Znajomość obu i tego, którego wymaga dana linia, to większość różnicy między działającym kodem na typach a kodem po cichu zwracającym never.

