Przejdź do treści
webtype.orgwebtype.org#216 type-level-add · par 5

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 216 · 24 lipca 2026 · Bezlitosna

    Dodawanie na poziomie typów

    Zaimplementuj `Add<A, B>`, aby zwracał sumę jako literał liczbowy. TypeScript nie ma arytmetyki na typach, więc trzeba liczyć — `BuildTuple<N>` jest dostępne i daje krotkę długości `N`.

    01

    Spróbuj rozwiązać samodzielnie

    Par 5

    Zagadka

    type-level-add.ts
    type BuildTuple<N extends number, Acc extends unknown[] = []> =
      Acc['length'] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>
    Podejście 1 z 5Jeszcze nie sprawdzone

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

    Testy

    4
    • Add<1, 2>
      3
    • Add<0, 0>
      0
    • Add<12, 5>
      17
    • Add<40, 2>
      42

    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 25 lipca 2026

    Rozwiązanie

    type Add<A extends number, B extends number> = [
      ...BuildTuple<A>,
      ...BuildTuple<B>,
    ]['length']

    Najczęstsza błędna odpowiedź

    type Add<A extends number, B extends number> =
      [...BuildTuple<A>]['length']

    To odczytuje długość, ale nigdy nie łączy obu krotek, więc `B` jest całkowicie ignorowane. Arytmetyka musi wydarzyć się w krotce, a nie po niej.

    Linia po linii

    1. [...BuildTuple<A>, ...BuildTuple<B>]

      Rozwinięcia krotek wariadycznych. Dwie krotki o długościach `A` i `B` łączą się w jedną o długości `A + B` — to złączenie jest dodawaniem.

    2. ['length']

      Dostęp indeksowany na krotce. Dla krotki o stałej długości właściwość `length` jest literałem liczbowym, czyli dokładnie tym, czego szukamy.

    Do zapamiętania

    Arytmetyka na typach to przebrane liczenie. Długość krotki to jedyny licznik, jaki daje TypeScript, a limit głębokości rekurencji zatrzymuje go w okolicach tysiąca — dlatego nikt nie wydaje kalkulatora na typach.

    Wykorzystuje