Rozwiązanie z komentarzem
Opublikowano 13 września 2026Rozwiązanie
type StrLength<S extends string, R extends unknown[] = []> = S extends `${string}${infer Rest}` ? StrLength<Rest, [...R, unknown]> : R['length']
Najczęstsza błędna odpowiedź
type StrLength<S extends string, R extends unknown[] = []> = S['length']Typ tekstowy owszem ma length i jest nią number — ta ogólna, nie 5. Tylko krotki niosą swoją długość jako typ literalny. To dlatego niemal każdy liczący typ w TypeScripcie pisze się z krotkowym akumulatorem, którego zawartości nikt nigdy nie czyta.
Linia po linii
`${string}${infer Rest}`Pierwszy symbol zastępczy to
string, a nieinfer, bo sam znak nie ma znaczenia — liczy się tylko to, że jakiś był.[...R, unknown]Akumulator to karbowanie. Typ jego elementów jest bez znaczenia;
unknownwybrano właśnie dlatego, że nikt nigdy do środka nie zajrzy.R['length']A tutaj karby są spieniężane. Ponieważ
Rjest krotką, jejlengthto literał5— dokładnie to, o co pyta sprawdzenie.
Do zapamiętania
Liczby na poziomie typów to długości krotek. Ilekroć musisz coś policzyć, odpowiedzią jest krotka, którą powiększasz, a potem pytasz o jej długość.

