Flujo de trabajo Git para TypeScript: cómo no volverse loco con el código tipado

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Flujo de trabajo Git para TypeScript: cómo dejar de temer los conflictos de fusión

\n\n

Si alguna vez has intentado fusionar dos ramas, donde una modificaba la interfaz User y la otra añadía un nuevo tipo en el mismo módulo, sabes lo que es una crisis existencial de desarrollador. TypeScript nos da un potente sistema de tipos, pero sin un flujo de trabajo Git adecuado, ese poder se convierte en un dolor de cabeza.

\n\n

En este artículo, analizaremos el flujo de trabajo Git óptimo para proyectos TypeScript, desde la configuración de ramas hasta la verificación automática de tipos en cada commit. Sin rodeos, solo lo que realmente funciona en producción.

\n\n

¿Por qué TypeScript requiere un enfoque especial para Git?

\n\n

TypeScript no es solo "JavaScript con tipos". Es un lenguaje donde cada cambio puede afectar a decenas de archivos a través de interface, type y genéricos. Una modificación incorrecta en un tipo base y todo el proyecto deja de compilar.

\n\n

Por lo tanto, un flujo de trabajo Git estándar para TypeScript debe incluir:

\n\n
    \n
  • Verificación obligatoria de tipos antes del commit
  • \n
  • Un linter que impida commitear código sin formato
  • \n
  • Una estrategia de ramificación clara para que los conflictos de fusión no rompan los tipos
  • \n
  • CI/CD que lo verifique todo en el servidor
  • \n
\n\n

Analicemos cada punto en orden.

\n\n

1. Elegir una estrategia de ramificación: ¿Git Flow o Trunk-based?

\n\n

Para proyectos TypeScript, recomiendo el desarrollo Trunk-based con ramas de corta duración. ¿Por qué? Porque el código TypeScript es, esencialmente, código "en bruto" que necesita ser verificado y desplegado rápidamente. Las ramas largas hacen que los tipos se "desalineen".

\n\n

Estructura básica de ramas

\n\n
main        — versión estable, siempre lista para desplegar\ndevelop     — rama principal de desarrollo\nfeature/*   — nuevas funcionalidades (viven 1-2 días)\nfix/*       — correcciones de errores\nrelease/*   — preparación de lanzamiento (opcional)\n
\n\n

Ejemplo para un proyecto TypeScript:

\n\n
git checkout -b feature/add-user-validation\n# trabajamos...\ngit commit -m "feat: add email validation for User type"\ngit push origin feature/add-user-validation\n# creamos PR → fusionamos en develop\n
\n\n

Importante: nunca hagas rebase en main si el proyecto tiene tipos compartidos. Usa merge: conserva el historial y no rompe dependencias.

\n\n

2. Git Hooks: protección contra tontos (y contra ti mismo)

\n\n

El escenario más común: olvidaste ejecutar tsc, hiciste commit, hiciste push y el CI falló. Para evitarlo, configuramos pre-commit hooks.

\n\n

Instalación de Husky + lint-staged

\n\n

Husky es una herramienta para gestionar Git hooks. lint-staged ejecuta comandos solo en los archivos modificados.

\n\n
npm install --save-dev husky lint-staged\nnpx husky init\n
\n\n

Creamos el archivo .husky/pre-commit:

\n\n
#!/usr/bin/env sh\n. "$(dirname -- "$0")/_/husky.sh"\n\nnpx lint-staged\n
\n\n

En package.json añadimos:

\n\n
{\n  "lint-staged": {\n    "*.ts": [\n      "eslint --fix",\n      "prettier --write",\n      "tsc --noEmit"\n    ]\n  }\n}\n
\n\n

Ahora, antes de cada commit:

\n
    \n
  1. Se ejecuta ESLint con corrección automática
  2. \n
  3. Se formatea el código con Prettier
  4. \n
  5. Se verifica la compilación de TypeScript (tsc --noEmit)
  6. \n
\n\n

Si algún paso falla, el commit no se realiza. Es duro, pero efectivo.

\n\n

3. Mensajes de commit correctos: conventional commits

\n\n

Los proyectos TypeScript se benefician de los conventional commits porque:

\n
    \n
  • Se genera un changelog automáticamente
  • \n
  • Es fácil entender qué cambios rompen los tipos
  • \n
  • Se puede activar el CI solo para commits específicos
  • \n
\n\n

Ejemplos:

\n\n
feat: add UserRole enum and validation\nfix: c                

Blogs

Book Recommendations