Właściwość tylko do odczytu
Cannot assign to 'x' because it is a read-only property.Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.
Właściwość jest oznaczona jako `readonly`, co jest obietnicą na czas kompilacji, że nie zostanie nadpisana — i niczym więcej.
Odtworzenie
const point: { readonly x: number } = { x: 1 } point.x = 2
Build potwierdza, że to emituje dokładnie ten kod.
Dlaczego kompilator tak mówi
`readonly` znika w czasie wykonania. Zatrzymuje przypisania, które kompilator widzi, i nic poza tym — ten sam obiekt przekazany do JavaScriptu albo osiągnięty przez alias tego samego typu bez `readonly` jest w pełni mutowalny. Dokumentuje intencję i łapie uczciwe pomyłki, co jest sporo warte i nie jest tym samym co zamrożenie.
Naprawy
- 01
const point: { x: number } = { x: 1 } point.x = 2
Usuń modyfikator, jeśli wartość naprawdę ma się zmieniać. `readonly` na czymś, co mutujesz, to komentarz, który kłamie.
- 02
const point: { readonly x: number } = { x: 1 } const moved: { readonly x: number } = { ...point, x: 2 }
Albo zbuduj nowy. O to właśnie prosi `readonly` i dlatego warto ten modyfikator zachować: stara wartość pozostaje poprawna dla każdego, kto wciąż ją trzyma.
Wniosek
`readonly` to notatka dla innych programistów, którą kompilator akurat egzekwuje. To nie `Object.freeze` i nigdy nie dociera do czasu wykonania.