We can use an indexed access type to look up a specific property on another type:
typePerson = {age : number;name : string;alive : boolean };typetype Age = numberAge =Person ["age"];
The indexing type is itself a type, so we can use unions, keyof
, or other types entirely:
typetype I1 = string | numberI1 =Person ["age" | "name"];
typetype I2 = string | number | booleanI2 =Person [keyofPerson ];
typeAliveOrName = "alive" | "name";typetype I3 = string | booleanI3 =Person [AliveOrName ];
You’ll even see an error if you try to index a property that doesn’t exist:
typeProperty 'alve' does not exist on type 'Person'.2339Property 'alve' does not exist on type 'Person'.I1 =Person ["alve" ];
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:
constMyArray = [{name : "Alice",age : 15 },{name : "Bob",age : 23 },{name : "Eve",age : 38 },];
typetype Person = {Person = typeofMyArray [number];name: string;
age: number;
}
typetype Age = numberAge = typeofMyArray [number]["age"];
// Ortypetype Age2 = numberAge2 =Person ["age"];
You can only use types when indexing, meaning you can’t use a const
to make a variable reference:
constkey = "age";typeType 'any' cannot be used as an index type.Age =Person []; key
'key' refers to a value, but is being used as a type here. Did you mean 'typeof key'?2538
2749Type 'any' cannot be used as an index type.
'key' refers to a value, but is being used as a type here. Did you mean 'typeof key'?
However, you can use a type alias for a similar style of refactor:
typekey = "age";typeAge =Person [key ];