Przejdź do treści
webtype.org#229 flatten-tuple · par 4

Nr 229 · 6 sierpnia 2026 · Trudna

Spłaszcz

Zaimplementuj `Flatten<T>`, aby całkowicie spłaszczał zagnieżdżoną krotkę, na dowolną głębokość.

01

Spróbuj rozwiązać samodzielnie

Par 4

Zagadka

flatten-tuple.ts
Podejście 1 z 4Jeszcze nie sprawdzone

Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej. Tab wcina; naciśnij Escape, a potem Tab, by wyjść fokusem.

Testy

4
  • Flatten<[1, [2, 3], 4]>
    [1, 2, 3, 4]
  • Flatten<[]>
    []
  • Flatten<[[[1]]]>
    [1]
  • Flatten<[1, [2, [3, [4]]]]>
    [1, 2, 3, 4]

Jak oceniamy test Dokładna równość typów, nie przypisywalność — przecięcie to nie to samo co spłaszczony obiekt.

Jak poszło innym

Tę zagadkę rozwiązało jak dotąd mniej niż 5 osób. Rozkład pojawi się, gdy próbka będzie na tyle duża, by coś znaczyć.

Archiwum
02

Rozwiązanie z komentarzem

Opublikowano 7 sierpnia 2026

Rozwią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

  1. 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ą.

  2. [...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.