Tipos de acceso indexado

Tipos de acceso indexado

Podemos usar un tipo de acceso indexado para buscar una propiedad específica en otro tipo:

Prueba este código ↗

type Person = { age: number; name: string; alive: boolean };
type Age = Person["age"];
     
type Age = number

El tipo de indexación es en sí mismo un tipo, por lo que podemos usar uniones, keyof u otros tipos por completo:

Prueba este código ↗

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 | boolean

Incluso verás un error si intentas indexar una propiedad que no existe:

Prueba este código ↗

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

Otro ejemplo de indexación con un tipo arbitrario es usar number para obtener el tipo de elementos de una array. Podemos combinar esto con typeof para capturar convenientemente el tipo de elemento de un literal de array:

Prueba este código ↗

const MyArray = [
  { name: "Alice", age: 15 },
  { name: "Bob", age: 23 },
  { name: "Eve", age: 38 },
];
 
type Person = typeof MyArray[number];
       
type Person = {
    name: string;
    age: number;
}
type Age = typeof MyArray[number]["age"];
     
type Age = number
// Or
type Age2 = Person["age"];
      
type Age2 = number

Solo puedes usar tipos al indexar, lo que significa que no puedes usar const para hacer una referencia a una variable:

Prueba este código ↗

const key = "age";
type Age = Person[key];
Error generado
Type 'key' 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'?

Sin embargo, puedes usar un alias de tipo para un estilo similar de refactorización:

Prueba este código ↗

type key = "age";
type Age = Person[key];
Última actualización