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 extendsnumber, Acc extendsunknown[] = []> =
Acc['length'] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>
type Add<A extendsnumber, B extendsnumber> = [
...BuildTuple<A>,
...BuildTuple<B>,
]['length']
Najczęstsza błędna odpowiedź
type Add<A extendsnumber, B extendsnumber> =
BuildTuple<A>['length'] extendsinfer 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
[...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.
['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.