noUncheckedIndexedAccess
Sygnatura indeksowa to zgadywanie
Odczyt klucza, którego nigdy nie zapisano, daje `undefined` w czasie wykonania. To flaga, która mówi o tym w typie.
- Od
- TypeScript 4.1
- strict
- Poza strict
- W twoim tsconfigu
"noUncheckedIndexedAccess": true- Skompilowane z
"strict": true
Ten sam fragment za każdym razem. Zmieniła się tylko opcja.
Z wyłączoną
"noUncheckedIndexedAccess": falseconst rows: Record<string, string> = {} export const first: string = rows.a
Kompiluje się czysto
Z włączoną
"noUncheckedIndexedAccess": trueconst rows: Record<string, string> = {} export const first: string = rows.a
Zgłasza TS2322
Dlaczego kompilator się tym przejmuje
Najbardziej zaskakujące w `strict` jest to, że tego nie zawiera. `Record<string, string>` twierdzi, że każdy z nieskończenie wielu kluczy tekstowych trzyma string, co nigdy nie jest prawdą o żadnym realnym obiekcie — i ta sama dziura jest w każdym dostępie do tablicy: `items[5]` na trzyelementowej tablicy to `undefined`, otypowane jako element. Nie jest pod `strict`, bo włączenie jej przepisuje każde ciało pętli i każde wyszukanie w bazie kodu, a to uznano za zbyt dużo, by narzucać domyślnie. Mimo to jest to właściwe ustawienie.
Wniosek
Włącz ją wcześnie w projekcie albo nigdy. Dokładanie jej później jest tym drogim wariantem.
Gdzie iść dalej
Opcji: 22

