馃敟 TYPE MANIPULATION, IAT, INDEXED ACCESS TYPES (TIPOS BASADOS EN 脥NDICES)

Podemos utilizar indexed access types (tipos basados en 铆ndices) para buscar una propiedad espec铆fica en otro tipo.

type Persona = { edad: number; nombre: string; vivo: boolean };

type Edad = Persona["edad"];

const edad1: Edad = 5;
const edad2: Edad = "quince"; // <- esta l铆nea generar谩 un error

Los IAT son en si mismos tipos, por lo que podemos utilizar unions, keyof u otros tipos.

type Persona = { edad: number; nombre: string; vivo: boolean };

type I1 = Persona["edad" | "nombre"]; // <- union dentro de una referencia a 铆ndices

type I2 = keyof Persona;

let miI2: I2; // <- puede ser number | string o boolean

Otro ejemplo de IAT es el poder utilizar number de forma arbitraria para obtener el tipo de los elementos de un arreglo. Esta posibilidad se puede combinar con typeof para convenientemente capturar el tipo de elemento.

const miArreglo = [
    { nombre: "Martha", edad: 22 },
    { nombre: "Zhenya", edad: 31 },
    { nombre: "Luis", edad: 28 },
];

type Persona = (typeof miArreglo)[number]; // <- combinaciones posibles { nombre: string, edad: number }

type OtraPersona = (typeof miArreglo)[number]["nombre"]; // <- string

Si el arreglo no es homog茅neo, es decir que las propiedades son diferentes para cada uno de los elementos que lo componen, el resultado de typeof miArreglo[number] es la uni贸n de todos las opciones posibles.

const miArreglo2 = [
    { nombre: "Ana", sexo: "F" },
    { nombre: "Luisa", viva: true },
    { nombre: "Daria", edad: 40 },
];

type Persona2 = (typeof miArreglo2)[number];
// <- combinaciones { nombre: string, sexo: string } | { nombre: string, viva: boolean } | { nombre: string, edad: number }

Solo se pueden utilizar types cuando se hace indexing, esto quiere decir que no se puede usar const para hacer una referencia a una variable.

const key = "edad";
type Edad = Persona[key]; // <- esto generar谩 un error

Sin embargo, se puede utilizar un alias type.

type key = "edad";
type Edad = Persona[key];