Volver a TypeScript Básico

Tipos Utilitarios

TypeScript incluye tipos utilitarios integrados que transforman tipos existentes en nuevos tipos.

Partial y Required

interface Usuario { id: number; nombre: string; correo: string; bio: string; } // Partial<T> — todas las propiedades se vuelven opcionales type ActualizacionUsuario = Partial<Usuario>; // { id?: number; nombre?: string; correo?: string; bio?: string } function actualizarUsuario(id: number, cambios: Partial<Usuario>): Usuario { return { ...obtenerUsuario(id), ...cambios }; } // Required<T> — todas las propiedades se vuelven requeridas type UsuarioCompleto = Required<ActualizacionUsuario>;

Pick y Omit

// Pick<T, Keys> — conservar solo las claves seleccionadas type VistaPrevia = Pick<Usuario, "id" | "nombre">; // { id: number; nombre: string } // Omit<T, Keys> — eliminar las claves seleccionadas type UsuarioPublico = Omit<Usuario, "correo">; // { id: number; nombre: string; bio: string } // Patrón común: tipos DTO type CrearUsuarioDTO = Omit<Usuario, "id">; type ActualizarUsuarioDTO = Partial<Omit<Usuario, "id">>;

Record

// Record<Keys, Values> — tipo de mapa type Roles = "admin" | "usuario" | "visitante"; type MapaPermisos = Record<Roles, string[]>; const permisos: MapaPermisos = { admin: ["leer", "escribir", "eliminar"], usuario: ["leer", "escribir"], visitante: ["leer"], }; // Tipo de objeto dinámico type MapaUsuarios = Record<string, Usuario>; const cache: MapaUsuarios = {};

Readonly y ReadonlyArray

// Readonly<T> — todas las propiedades se vuelven de solo lectura type UsuarioInmutable = Readonly<Usuario>; const usuario: UsuarioInmutable = { id: 1, nombre: "Alice", correo: "", bio: "" }; // usuario.nombre = "Bob"; // Error // ReadonlyArray const numeros: ReadonlyArray<number> = [1, 2, 3]; // numeros.push(4); // Error // numeros[0] = 5; // Error

ReturnType y Parameters

function obtenerUsuario(id: number, opciones: { timeout: number }) { return { id, nombre: "Alice" }; } // Extraer tipo de retorno type ResultadoObtener = ReturnType<typeof obtenerUsuario>; // { id: number; nombre: string } // Extraer tipos de parámetros como tupla type ParamsObtener = Parameters<typeof obtenerUsuario>; // [id: number, opciones: { timeout: number }]

Exclude y Extract

type TodosEventos = "click" | "keydown" | "mousemove" | "resize"; // Exclude<T, U> — eliminar tipos de la unión type EventosSinRaton = Exclude<TodosEventos, "click" | "mousemove">; // "keydown" | "resize" // Extract<T, U> — conservar solo los tipos que coinciden type EventosRaton = Extract<TodosEventos, "click" | "mousemove" | "touchstart">; // "click" | "mousemove"

Combinando Utilitarios

// Patrón del mundo real: estado de formulario interface FormularioProducto { nombre: string; precio: number; stock: number; categoria: string; descripcion: string; } type ErroresFormulario = Partial<Record<keyof FormularioProducto, string>>; type CamposTocados = Partial<Record<keyof FormularioProducto, boolean>>; interface EstadoFormulario { valores: FormularioProducto; errores: ErroresFormulario; tocados: CamposTocados; enviando: boolean; }

Consejo avanzado: Combina tipos utilitarios para crear tipos precisos sin repetición: Partial<Pick<Usuario, "nombre" | "bio">>.