Rozwiązanie z komentarzem
Opublikowano 7 sierpnia 2026Rozwiązanie
type Flatten<T extends readonly unknown[]> = T extends readonly [infer H, ...infer R] ? H extends readonly unknown[] ? [...Flatten<H>, ...Flatten<R>] : [H, ...Flatten<R>] : []
Najczęstsza błędna odpowiedź
type Flatten<T extends readonly unknown[]> = T extends readonly [infer H, ...infer R] ? H extends readonly unknown[] ? [...H, ...Flatten<R>] : [H, ...Flatten<R>] : []
Rozwinięcie `H` wprost zdejmuje dokładnie jedną warstwę, więc `[[[1]]]` spłaszcza się do `[[1]]` i koniec. Głowę też trzeba spłaszczyć rekurencyjnie — to nie jest jedynie pojemnik do otwarcia, lecz cała zagnieżdżona struktura.
Linia po linii
H extends readonly unknown[]Gałąź decydująca, czy ten element trzeba otworzyć. `readonly unknown[]` pasuje zarówno do krotek modyfikowalnych, jak i tylko do odczytu, więc żadna nie zostanie wzięta za wartość skalarną.
[...Flatten<H>, ...Flatten<R>]Dwa wywołania rekurencyjne: jedno schodzi w zagnieżdżenie, drugie idzie wzdłuż krotki. Ta para czyni spłaszczanie zupełnym, a nie jednopoziomowym.
Do zapamiętania
Rekurencja w jednym kierunku przechodzi listę; w dwóch — drzewo. Większość błędów „zeszło tylko o poziom” to brak drugiego wywołania rekurencyjnego.