Volver a TypeScript Básico
TypeScript
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">>.