this post was submitted on 29 Jul 2025
-1 points (44.4% liked)

Programming

14145 readers
5 users here now

All things programming and coding related. Subcommunity of Technology.


This community's icon was made by Aaron Schneider, under the CC-BY-NC-SA 4.0 license.

founded 2 years ago
MODERATORS
 

TypeScript does not throw an error at compile time for accessing an out-of-bounds index. Instead, it assumes that the value could be one of the types defined in the array (in this case, 1 or 2) or undefined.

TypeScript automatically infers the type of a value accessed from an array, even if that access is out of bounds. It assumes that the value could be one of the defined types or undefined, which can lead to confusion if you expect stricter enforcement of valid indices.

I just spent the last 2 hours trying to understand why I was getting a valid type from something that shouldn't have been valid.

I think that the hate that JavaScript receives is well deserved, at least coming from Rust this is an absolute nightmare.

you are viewing a single comment's thread
view the rest of the comments
[–] hallettj@leminal.space 3 points 2 weeks ago

You have two options depending on how you set your Typescript config.

Option 1, the default:

declare const xs: number[]
const x = xs[4] // inferred type is `number`

Option 2, using the noUncheckedIndexedAccess setting:

declare const xs: number[]
const x = xs[4] // inferred type is `number | undefined`

Your AI assistant appears to assume option 2. Maybe you have that option enabled in your project?

I'm sorry you had to spend a lot of time and frustration on this problem. But fundamentally Rust and Typescript have the same limitation: neither will catch out-of-bounds access errors on variable-length collections at type-checking time. They don't have the necessary information to do that.

Rust can catch out-of-bounds access on a fixed-length array if you use a literal number for the index access. But Typescript can do the same thing if you use a fixed-length tuple type (e.g. [number, number] instead of number[]).