"T[K]reads a property type the same wayobj[key]reads a value."
The indexed-access type operator
T[K] evaluates to the type of T's property at key K. { id: number; name: string }['id'] is number. { id: number; name: string }['name'] is string. The syntax mirrors runtime property access; the difference is that this happens at the type level.
K can be a single key or a union of keys: User['id' | 'name'] is number | string. The result is the union of value types at those keys.
Numeric indexed access for arrays
string[][number] is string — the element type of a string array. [number, string][0] is number — the first position of a tuple. [number, string][number] is number | string — the union of all positions.
For tuples, integer literal access gives you the type at that position. For arrays, [number] gives the element type. This is the canonical way to talk about array elements at the type level.
The keyof + indexed access pattern (revisited)
T[keyof T] is the union of all value types in T. This pairing is so common that it has a name in the docs: 'indexed access through keyof.' Combined with mapped types, it's how most utility types navigate object shapes.
T[K], most advanced TypeScript type definitions become navigable.