Przejdź do treści
webtype.orgwebtype.orgtsconfig

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    tsconfig

    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": false
    const rows: Record<string, string> = {}
    
    export const first: string = rows.a

    Kompiluje się czysto

    Z włączoną

    "noUncheckedIndexedAccess": true
    const 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