Konstrukcje
Variadic tuples
Rozwijanie i dopasowywanie krotek po pozycji — tak poziom typów robi listy.
Czym jest
Krotka zna swoją długość jako typ literalny i na tym fakcie zbudowany jest każdy typ liczący. Połącz to ze wzorcami głowa-i-reszta, a masz rekurencję po liście: odetnij element, zrób coś, wywołaj się na reszcie. Listy parametrów też są krotkami i dlatego te same techniki przepisują sygnatury funkcji.
Przykłady
Push<[1, 2], 3>
→[1, 2, 3]Tail<[1, 2, 3]>
→[2, 3]['a', 'b']['length']
→2Literalna długość. Tablica odpowiedziałaby tu `number`, a ta różnica jest całym powodem, dla którego krotki mają na poziomie typów znaczenie.
Każdy rozwinięty typ powyżej wypisał TypeScript 5.9.3, nie ręka człowieka.
Czego nie robi
- Nie pozwala indeksować poza koniec. Długość krotki jest obietnicą, a TS2493 to kompilator jej dotrzymujący.
- Nie rekurencjonuje bez końca. Liczenie po jednym elemencie trafia w sufit instancjacji około pięćdziesięciu, co jest TS2589 i nie da się tego podkręcić.
Wniosek
Gdy potrzebujesz liczby na poziomie typów, prawie zawsze chcesz krotki, którą powiększasz, a potem pytasz o jej długość. Zawartości nikt nie czyta.