Ce face indexed access (T[K])
Ca și la valori, unde obiect["nume"] citește o proprietate, la tipuri Elev["nume"] dă tipul proprietății nume. Poți folosi un union de chei (Elev["nume" | "nota"] dă string | number) sau keyof (Elev[keyof Elev] dă union-ul tuturor tipurilor de valori).
T[number] dă tipul elementelor unui tablou sau tuple. Combinat cu typeof și as const, transformă un tablou de valori într-un union de tipuri literale.
Accesul se poate înlănțui: Comanda["client"]["adresa"]["oras"]. Este util ca tipurile să rămână legate: dacă se schimbă tipul proprietății în interfață, se schimbă peste tot. Cheia trebuie să fie un tip, nu o variabilă: T[k] cu const k = "nume" nu funcționează; scrie T[typeof k].
Exemple
Exemplul 1: Tipul unei proprietăți imbricate
interface Comanda {
id: number;
client: {
nume: string;
adresa: { oras: string; judet: string };
};
produse: { nume: string; pret: number }[];
}
type Adresa = Comanda["client"]["adresa"];
type Produs = Comanda["produse"][number];
function eticheta(a: Adresa): string {
return `${a.oras}, jud. ${a.judet}`;
}
const p: Produs = { nume: "Cafea", pret: 32 };
console.log(eticheta({ oras: "Iași", judet: "Iași" }), p);
Rezultat
Iași, jud. Iași { nume: 'Cafea', pret: 32 }
Exemplul 2: Union de tipuri și valori dintr-un obiect constant
const CODURI = { ok: 200, negasit: 404, eroare: 500 } as const;
type Cod = (typeof CODURI)[keyof typeof CODURI]; // 200 | 404 | 500
function mesaj(cod: Cod): string {
return cod === 200 ? "Totul în regulă" : `Problemă (${cod})`;
}
console.log(mesaj(CODURI.ok), mesaj(CODURI.negasit));
Rezultat
Totul în regulă Problemă (404)
Exemplul 3: Proprietate care nu există
interface Elev {
nume: string;
}
type V = Elev["varsta"];
const v: V = 1;
console.log(v);
Eroarea afișată de tsc
exemplu.mts(4,15): error TS2339: Property 'varsta' does not exist on type 'Elev'.
Greșeli frecvente
- Folosești
.în loc de paranteze:Comanda.clientnu este un tip valid. ScrieComanda["client"]. - Pui o variabilă ca index de tip (
T[cheie]). ScrieT[typeof cheie]sau direct literalul.
Comenzi înrudite
keyof: keyof T dă union-ul numelor de proprietăți ale lui T, de exemplu „nume” | „oras”.typeof (tip): În poziție de tip, typeof x dă tipul variabilei sau funcției x, ca să nu-l scrii de mână.mapped types: Construiesc un tip nou trecând prin fiecare cheie a altui tip: { [K in keyof T]: … }.as const: Face un literal complet readonly și păstrează valorile exacte ca tipuri: „Iași” în loc de string.Pick: Pick<T, K> păstrează din T doar proprietățile cu numele din K.