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] : never
To 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 `never` daje `never` i 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. `K` domyślnie równa się `T`, zachowując nietkniętą kopię, gdy `T` jest zawężane przez `Exclude`.
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`.