typeof (tip) în TypeScript

În poziție de tip, typeof x dă tipul variabilei sau funcției x, ca să nu-l scrii de mână.

Sintaxă
type T = typeof valoare;
type F = typeof functie;
type R = ReturnType<typeof functie>;

Ce face typeof (tip)

typeof are două sensuri. În cod obișnuit, este operatorul din JavaScript care returnează la rulare un text ("string", "number"…); vezi typeof guard. În poziție de tip (după : sau în type X = ...), este operatorul TypeScript care dă tipul unei variabile, al unei funcții sau al unui obiect.

Este util când ai deja o valoare și vrei tipul ei: un obiect de configurare, o funcție dintr-o bibliotecă, un tablou constant. Se combină des cu keyof, cu ReturnType, Parameters și cu as const ((typeof LISTA)[number] dă union-ul elementelor).

typeof de tip acceptă doar nume de variabile și proprietăți (typeof setari.limba), nu expresii arbitrare: typeof f() nu este permis; folosește ReturnType<typeof f>.

Exemple

Exemplul 1: Tipul unui obiect de configurare

const setariImplicite = {
    limba: "ro",
    tema: "luminoasă",
    marimeFont: 16,
};
type Setari = typeof setariImplicite;   // { limba: string; tema: string; marimeFont: number }

function aplica(schimbari: Partial<Setari>): Setari {
    return { ...setariImplicite, ...schimbari };
}

console.log(aplica({ marimeFont: 18 }));

Rezultat

{ limba: 'ro', tema: 'luminoasă', marimeFont: 18 }

Exemplul 2: Union din elementele unui tablou constant

(typeof ORASE)[number] înseamnă „tipul oricărui element din tablou”. Cu as const, elementele au tipuri literale.

const ORASE = ["Iași", "Cluj", "Timișoara"] as const;
type Oras = (typeof ORASE)[number];     // "Iași" | "Cluj" | "Timișoara"

function esteOras(x: string): x is Oras {
    return (ORASE as readonly string[]).includes(x);
}

for (const x of ["Cluj", "Paris"]) {
    console.log(x, esteOras(x) ? "este în listă" : "nu este în listă");
}

Rezultat

Cluj este în listă
Paris nu este în listă

Exemplul 3: Tipul rezultatului unei funcții

function creeazaElev(nume: string, nota: number) {
    return { nume, nota, promovat: nota >= 5, creat: "2026-10-19" };
}
type Elev = ReturnType<typeof creeazaElev>;

const lista: Elev[] = [creeazaElev("Ana", 10), creeazaElev("Mihai", 4)];
console.log(lista.filter((e) => e.promovat).map((e) => e.nume));

Rezultat

[ 'Ana' ]

Greșeli frecvente

  • Scrii type T = typeof creeazaElev("a", 1). Nu se acceptă un apel; folosește ReturnType<typeof creeazaElev>.
  • Confunzi cele două typeof: if (typeof x === "string") rulează în JavaScript, type T = typeof x există doar la compilare.

Comenzi înrudite

  • keyof: keyof T dă union-ul numelor de proprietăți ale lui T, de exemplu „nume” | „oras”.
  • typeof guard: Verificarea typeof x === „string” (sau „number”, „boolean”…) restrânge tipul la primitivul respectiv.
  • ReturnType: ReturnType<F> dă tipul rezultatului unei funcții; pentru o funcție concretă scrii ReturnType<typeof f>.
  • as const: Face un literal complet readonly și păstrează valorile exacte ca tipuri: „Iași” în loc de string.
  • indexed access (T[K]): T[„cheie”] dă tipul unei proprietăți din T; T[number] dă tipul elementelor unui tablou.