Volver al Blog
X

TypeScript: Patrones en React que Escalan en Producción

En este artículo

TypeScript no es llenar el código de tipos hasta que el compilador deje de quejarse. En proyectos React medianos y grandes, el objetivo es evitar bugs y dejar claro qué espera cada capa.

Tras años con React en producción (AEM, LGPD, productos propios), estos patrones ayudan cuando el equipo crece.


1. Modela el dominio antes del componente

En lugar de data: any, define tipos cerca del hook o del service:

ts
export type PricePoint = {
  date: string
  value: number
  marketplace: 'amazon' | 'mercadolivre' | 'shopee'
}

export type ProductSummary = {
  id: string
  title: string
  currentPrice: number
  history: PricePoint[]
}

El componente recibe ProductSummary — no JSON suelto de la API. Si el backend cambia, el error aparece en el lugar correcto.


2. Usa unions para estados de UI

Loading, error, vacío y éxito son más seguros con un union discriminado:

ts
type AsyncState<T> =
  | { status: 'idle' }
  | { status: 'loading' }
  | { status: 'error'; message: string }
  | { status: 'success'; data: T }

En JSX, un switch con never en default obliga a cubrir todos los casos — y evita mostrar data mientras carga.


3. Props claras, sin muchos booleanos

Prefiere una variante nombrada a cinco flags true/false:

ts
// ❌ difícil de mantener
type ButtonProps = { primary?: boolean; danger?: boolean; ghost?: boolean }

// ✅ claro y extensible
type ButtonProps = {
  variant?: 'primary' | 'secondary' | 'ghost' | 'danger'
  size?: 'sm' | 'md' | 'lg'
}

En design systems, evita combinaciones inválidas (primary + ghost a la vez).


4. satisfies y as const para configs

Menús, rutas y feature flags quedan tipados sin perder valores literales:

ts
const NAV_ITEMS = [
  { href: 'expertise', key: 'expertise' },
  { href: 'projects', key: 'projects' },
] as const satisfies ReadonlyArray<{ href: string; key: string }>

Mantienes autocomplete y validación en la definición.


5. Validación en el borde de la API (Zod o similar)

TypeScript desaparece tras el build. Validación en runtime en la entrada protege la UI:

ts
const ProductSchema = z.object({
  id: z.string(),
  title: z.string(),
  currentPrice: z.number().nonnegative(),
})

const product = ProductSchema.parse(await response.json())

Especialmente con APIs de terceros o scraping, donde el payload puede cambiar sin aviso.


Conclusión

TypeScript escala cuando los tipos describen el contrato entre capas — no cuando decoran el JSX.

Empieza por el dominio, modela estado async con unions, simplifica props y valida en el borde. El equipo gana velocidad con más confianza en el deploy.

Glauber Ariel Magalhães

Escrito por Glauber Ariel Magalhães

Ingeniero de software senior. Escribo sobre React, rendimiento, accesibilidad y seguridad — con ejemplos de proyectos reales.

Comentarios

Inicia sesión con tu cuenta de GitHub para comentar. Los comentarios son públicos y se guardan como Discussions en el repositorio de comentarios del blog.