readonly în TypeScript

Clase TypeScript 2.0

Marchează o proprietate care primește valoare o singură dată și nu mai poate fi modificată după aceea.

Sintaxă
class A { readonly id: number; }
interface B { readonly cod: string; }
let lista: readonly string[];

Ce face readonly

Un câmp readonly poate primi valoare doar la declarare sau în constructor. După aceea, orice atribuire este eroare de compilare. Se folosește pentru date care nu trebuie să se schimbe: un id, o dată de creare, o configurație.

readonly funcționează și în interfețe și aliasuri de tip, și pe tablouri: readonly string[] interzice push, sort și atribuirea elementelor. Tipul utilitar Readonly<T> face toate proprietățile unui tip readonly deodată.

Ca și modificatorii de acces, readonly este verificat doar la compilare și este „superficial”: un câmp readonly care conține un obiect nu poate fi înlocuit, dar proprietățile obiectului se pot modifica. Pentru a bloca și la rulare există Object.freeze din JavaScript.

Exemple

Exemplul 1: Câmp readonly într-o clasă

class Comanda {
    readonly id: number;
    readonly creata = "2026-10-19";
    produse: string[] = [];

    constructor(id: number) {
        this.id = id;           // permis: în constructor
    }
}

const c = new Comanda(101);
c.produse.push("pâine", "lapte");
console.log(c.id, c.creata, c.produse);

Rezultat

101 2026-10-19 [ 'pâine', 'lapte' ]

Exemplul 2: Modificare interzisă

interface Setari {
    readonly limba: string;
    readonly orase: readonly string[];
}
const s: Setari = { limba: "ro", orase: ["Iași"] };
s.limba = "en";
s.orase.push("Cluj");
console.log(s);

Eroarea afișată de tsc

exemplu.mts(6,3): error TS2540: Cannot assign to 'limba' because it is a read-only property.
exemplu.mts(7,9): error TS2339: Property 'push' does not exist on type 'readonly string[]'.

Exemplul 3: readonly este superficial

Câmpul adresa nu poate fi înlocuit, dar obiectul din el se poate modifica.

class Elev {
    readonly adresa = { oras: "Iași", strada: "Copou" };
}

const e = new Elev();
e.adresa.oras = "Cluj";       // permis: se schimbă interiorul obiectului
console.log(e.adresa);

Rezultat

{ oras: 'Cluj', strada: 'Copou' }

Greșeli frecvente

  • Crezi că readonly face obiectul înghețat. Doar proprietatea marcată nu se poate reatribui; pentru tot obiectul folosește Readonly<T> sau as const, la compilare, și Object.freeze la rulare.
  • Confunzi readonly cu const: const este pentru variabile, readonly pentru proprietăți.

Comenzi înrudite

  • Readonly: Readonly<T> face toate proprietățile lui T readonly: obiectul poate fi citit, dar nu modificat.
  • as const: Face un literal complet readonly și păstrează valorile exacte ca tipuri: „Iași” în loc de string.
  • array (T[] și Array<T>): Tipul tablourilor: T[] și Array<T> înseamnă același lucru, un tablou cu elemente de tipul T.
  • class: Clasele din JavaScript, cu tipuri pe câmpuri, constructor și metode, plus modificatori de acces și interfețe.
  • let și const cu tipuri: Declari variabile cu let (se pot schimba) sau const (nu se pot reatribui) și le pui tipul după două puncte.