TS2540
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ć.
readonlyna 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
readonlyi 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.

