Ce face optional chaining (?.)
Operatorul ?. (din JavaScript ES2020) oprește evaluarea dacă valoarea din stânga este null sau undefined și dă undefined, în loc să arunce eroarea Cannot read properties of undefined. elev?.adresa?.oras înlocuiește verificarea lungă elev && elev.adresa && elev.adresa.oras.
Merge la proprietăți (a?.b), la acces cu paranteze pătrate (a?.[0]) și la apeluri de funcții care pot lipsi (callback?.()). TypeScript adaugă undefined la tipul rezultatului: elev?.nume are tipul string | undefined.
Se combină natural cu ?? pentru o valoare implicită: elev?.adresa?.oras ?? "necunoscut". Spre deosebire de &&, ?. nu se oprește la 0, "" sau false, doar la null și undefined.
Exemple
Exemplul 1: Proprietăți imbricate care pot lipsi
interface Elev {
nume: string;
adresa?: { oras: string; strada?: string };
contact?: { telefoane: string[] };
}
const elevi: Elev[] = [
{ nume: "Ana", adresa: { oras: "Iași", strada: "Copou" }, contact: { telefoane: ["0722000111"] } },
{ nume: "Mihai", adresa: { oras: "Cluj" } },
{ nume: "Ioana" },
];
for (const e of elevi) {
console.log(e.nume.padEnd(6), e.adresa?.oras, e.adresa?.strada, e.contact?.telefoane?.[0]);
}
Rezultat
Ana Iași Copou 0722000111
Mihai Cluj undefined undefined
Ioana undefined undefined undefined
Exemplul 2: Apel de funcție opțională
interface Optiuni {
laFinal?: (total: number) => void;
}
function proceseaza(note: number[], optiuni: Optiuni = {}): void {
const total = note.reduce((s, n) => s + n, 0);
optiuni.laFinal?.(total);
}
proceseaza([9, 10]); // nu se întâmplă nimic
proceseaza([9, 10], { laFinal: (t) => console.log("Total:", t) });
Rezultat
Total: 19
Exemplul 3: Rezultatul poate fi undefined
e.adresa?.oras are tipul string | undefined, deci nu poate fi folosit direct ca string.
interface Elev {
adresa?: { oras: string };
}
const e: Elev = {};
const oras: string = e.adresa?.oras;
console.log(oras);
Eroarea afișată de tsc
exemplu.mts(5,7): error TS2322: Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'.
Greșeli frecvente
- Pui
?.peste tot, chiar unde valoarea nu poate lipsi. Ascunzi astfel erori reale; folosește-l doar unde tipul spune că lipsa este posibilă. - Încerci să atribui prin
?.:elev?.nume = "Ana". Nu este permis; tsc dă The left-hand side of an assignment expression may not be an optional property access.
Comenzi înrudite
nullish coalescing (??): a ?? b dă a, iar dacă a este null sau undefined dă b; spre deosebire de ||, păstrează 0, „” și false.null și undefined: Cu strictNullChecks, null și undefined sunt tipuri separate: o variabilă le acceptă doar dacă tipul ei le include.non-null (!): Semnul ! după o expresie îi spune compilatorului că valoarea nu este null sau undefined, fără verificare.narrowing: TypeScript urmărește verificările din cod (if, switch, return) și restrânge tipul unei variabile în fiecare ramură.