Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS2542

    Sygnatura indeksu tylko do odczytu

    Index signature in type '{ readonly [k: string]: number; }' only permits reading.

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    Obiekt przyjmuje dowolny klucz tekstowy i każdy z nich jest tylko do odczytu. To TS2540 zastosowane naraz do całej rodziny kluczy.

    Odtworzenie

    declare const ro: { readonly [k: string]: number }
    
    ro.x = 1

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    Sygnatura indeksu z `readonly` to sposób na opisanie tablicy odnośników, której nie wolno edytować w miejscu — zamrożonej konfiguracji, memoizowanej mapy oddawanej na zewnątrz, wyniku mapowania, którego nie chcesz mutować. Modyfikator obejmuje klucze, które jeszcze nie istnieją, i to zaskakuje najbardziej: nie wymyślisz klucza, który byłby zapisywalny.

    Naprawy

    1. 01
      declare const ro: { [k: string]: number }
      
      ro.x = 1

      Usuń `readonly`, jeśli tablica naprawdę ma być edytowana.

    2. 02
      declare const ro: { readonly [k: string]: number }
      
      const next: { readonly [k: string]: number } = { ...ro, x: 1 }

      Albo rozwiń do nowej. Oryginał pozostaje poprawny dla każdego, kto go trzyma, i po to właśnie był `readonly`.

    Wniosek

    `readonly` na sygnaturze indeksu to zdanie o każdym kluczu, obecnym i przyszłym. To najmocniejsza niezmienność, jaką oferuje system typów, i wciąż znika w czasie wykonania.

    Dokąd dalej

    Błędy