Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    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

    1. 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.

    2. 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.

    Dokąd dalej

    Błędy