"arr[5] might not exist. The type system should say so."
What it adds
Without noUncheckedIndexedAccess, an array index access has the type of the array's element. arr: string[] means arr[0] is string. But arr[100] is also typed string — even though at runtime it's undefined. The type system lies for indices that don't exist.
With the flag, every index access has type T | undefined. arr[0] on a string[] is string | undefined. You must handle the undefined case before using the value. The type system finally matches runtime reality.
Why it's separate from strict
The flag isn't part of strict: true because retrofitting it to an existing codebase requires touching every array index access. For new code, turn it on. For legacy code, plan the migration carefully.
Object index signatures too
The flag also affects index-signature object access. const obj: Record<string, User> = {}; obj['anyKey'] is User | undefined with the flag on. This is correct — a Record can return undefined for missing keys.
noUncheckedIndexedAccess is the most honest flag in TypeScript. It refuses to pretend index access can't return undefined. The discipline it forces — always narrow before use — eliminates a whole category of 'undefined is not an object' runtime bugs.