typescript - De ce proprietățile length ale array-urilor și string-urilor au tipuri de returnare diferite?
type GetLength2<T extends any[]> = T['length']
type a = GetLength2<[1]> // 1
type GetLength3<T extends string> = T['length']
type e = GetLength3<'abc'> // number
Proprietatea length a unui array returnează o valoare specifică, dar proprietatea length a unui string returnează un tip number, de ce?
Răspuns #1
[1] din GetLength2<[1]> nu este doar un array, ci este un tuple. Tuple-urile sunt tipuri speciale care definesc valoarea de la fiecare index al array-ului și de asemenea definesc lungimea array-ului. Deoarece tuple-urile definesc lungimea, GetLength2 obține acea lungime specifică. Dacă ai folosi un array normal în loc de un tuple (de exemplu, GetLength2<number[]>), rezultatul ar fi number.
Deși șirurile au la dispoziție unele variații specializate (de exemplu, tipurile de șir șablon), ele nu au nimic asemănător cu tuplele. Tipul 'abc' nu include informația că proprietatea length va returna 3. Poate că asta ar putea fi ceva ce ar putea adăuga în limbaj în viitor, dar momentan nu este prezent.