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
- 01
declare const ro: { [k: string]: number } ro.x = 1
Usuń `readonly`, jeśli tablica naprawdę ma być edytowana.
- 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.