Przejdź do treści

    ↑↓ 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