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

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.

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

Nobody is counting yet. Score distribution and the gra na krótkim dystansie board arrive with accounts — until then your results stay on this device.

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'] extends infer X ? X : never

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.