Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 250 · 2 września 2026 · Średnia

    Wypełnij

    Zaimplementuj Fill<N, V>, aby tworzył krotkę o dokładnie N elementach, każdy typu V.

    01

    Spróbuj rozwiązać samodzielnie

    Par 3

    Zagadka

    fill-tuple.ts
    Podejście 1 z 3Jeszcze nie sprawdzone

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

    Testy

    3
    • Fill<3, 'x'>—
      → ['x', 'x', 'x']
    • Fill<0, number>—
      → []
    • Fill<2, true>—
      → [true, true]

    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ć.

    Gra na krótkim dystansie

    Najmniej znaków

    Nie ma jeszcze publicznych wyników.

    Archiwum
    02

    Rozwiązanie z komentarzem

    Opublikowano 3 września 2026

    Rozwiązanie

    type Fill<N extends number, V, R extends V[] = []> = R['length'] extends N ? R : Fill<N, V, [...R, V]>

    Najczęstsza błędna odpowiedź

    type Fill<N extends number, V, R extends V[] = []> = R['length'] extends N ? R : [...R, V]

    To dokłada jeden element i kończy. Gałąź else musi wywołać Fill ponownie — dopisanie jest krokiem, nie odpowiedzią. Napisane tak, Fill<3, "x"> zwraca ["x"], bo typ wykonał się dokładnie raz.

    Linia po linii

    1. R['length'] extends N ? R : ...

      Akumulator jest zarazem licznikiem. Krotka zna swoją długość, więc nie ma tu żadnej arytmetyki — wystarczy zapytać, czy osiągnęła już N.

    2. Fill<N, V, [...R, V]>

      Każda rekurencja przekazuje kolejnemu wywołaniu odrobinę dłuższą krotkę. Fill<0, number> w ogóle nie wchodzi w tę gałąź, bo pusty akumulator ma już żądaną długość.

    Do zapamiętania

    Parametr-akumulator zamienia typ rekurencyjny w pętlę ze zmienną. Przypadek bazowy to pytanie o akumulator, a krok to ten sam typ wywołany z większym.

    Wykorzystuje