indexed access (T[K]) în TypeScript

T["cheie"] dă tipul unei proprietăți din T; T[number] dă tipul elementelor unui tablou.

Sintaxă
type X = Tip["proprietate"];
type Y = Tip["a" | "b"];
type Element = Tablou[number];

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.client nu este un tip valid. Scrie Comanda["client"].
  • Pui o variabilă ca index de tip (T[cheie]). Scrie T[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.