Warning: This page is a work in progress

Indexed Access Types

We can use an indexed access type to look up a specific property on another type:

type Person = { age: number; name: string; alive: boolean }; type A = Person["age"]; // ^ = type A = numberTry

The indexing type is itself a type, so we can use unions, keyof, or other types entirely:

type I1 = Person["age" | "name"]; // ^ = type I1 = string | number type I2 = Person[keyof Person]; // ^ = type I2 = string | number | boolean type AliveOrName = "alive" | "name"; type I3 = Person[AliveOrName]; // ^ = type I3 = string | booleanTry

You’ll even see an error if you try to index a property that doesn’t exist:

type I1 = Person["alve"]; Property 'alve' does not exist on type 'Person'.2339Property 'alve' does not exist on type 'Person'.Try

Another example of indexing with an arbitrary type is using number to get the type of an array’s elements. We can combine this with typeof to conveniently capture the element type of an array literal:

const MyArray = [ { name: "Alice", age: 15 }, { name: "Bob", age: 23 }, { name: "Eve", age: 38 }, ]; type T = typeof MyArray[number]; // ^ = type T = { // name: string; // age: number; // }Try

The TypeScript docs are an open source project. Help us improve these pages by sending a Pull Request

Contributors to this page:
OTOrta Therox  (1)

Last updated: Nov 23, 2020