Introducción: por qué es necesaria la revisión de código en TypeScript
La revisión de código no es solo una verificación formal del código antes de fusionarlo. Es una herramienta poderosa para mejorar la calidad del proyecto, compartir conocimientos dentro del equipo y prevenir errores en etapas tempranas. Cuando se trata de TypeScript, la revisión de código adquiere un significado especial: el tipado estático, un potente sistema de genéricos y la configuración estricta del compilador permiten detectar muchos errores incluso antes de ejecutar la aplicación. Sin embargo, incluso en TypeScript existen trampas que son fáciles de pasar por alto.
En este artículo, desglosaremos a qué prestar atención al revisar código TypeScript y cómo dar retroalimentación para que sea útil, no ofensiva.
1. Tipado y genéricos: no dejes que any lo arruine todo
Uno de los principales objetivos de TypeScript es hacer que los tipos sean explícitos. Si aparece any en el código, casi siempre es una señal de alerta. Durante la revisión de código, verifica:
- Ausencia de
any. Reemplázalo conunknowncon verificación de tipo posterior o un tipo específico. - Corrección de los genéricos. Asegúrate de que los parámetros de tipo no se pierdan y no se vuelvan demasiado amplios. Por ejemplo:
// Mal: perdemos el tipofunction getFirst(arr: any[]): any { return arr[0];}
// Bien: preservamos el tipo mediante un genéricofunction getFirst<T>(arr: T[]): T | undefined { return arr[0];}- Tipado de respuestas de API. Si llega JSON del servidor, debe describirse mediante una interfaz, no con
any. - Tipos utilitarios. Usa
Partial,Pick,Omitpara trabajar de forma flexible con objetos — esto reduce la duplicación de código.
Consejo: habilita las banderas strict: true y noImplicitAny: true en tsconfig.json — esto eliminará la mayoría de los problemas a nivel de compilación.
2. Lógica y manejo de errores: no te calles ante los problemas
TypeScript no protege contra errores lógicos, por lo que la revisión de código debe verificar la lógica de negocio y el manejo de excepciones.
Qué buscar:
- Manejo de casos límite. ¿Qué sucederá si el arreglo está vacío, el objeto es
nullo la cadena está vacía? Ejemplo:
// Mal: no verificamos la existencia del elementofunction getUserName(users: User[], id: string): string { return users.find(u => u.id === id)!.name; // puede lanzar un error}
// Bien: verificamosfunction getUserName(users: User[], id: string): string | null { const user = users.find(u => u.id === id); return user ? user.name : null;}- Operaciones asíncronas. Asegúrate de que las promesas se manejen correctamente con
async/awaity que los errores se capturen entry/catch. - Evitar mutaciones. Si una función no debe modificar los datos de entrada, usa
readonlyy métodos inmutables (por ejemplo,mapen lugar deforEachcon modificación de un arreglo externo).
3. Estilo de código y legibilidad: el código se escribe para las personas
Incluso el código perfectamente tipado puede ser ilegible. La revisión de código es un buen momento para discutir el estilo.
Puntos clave:
- Nomenclatura. Las variables, funciones y clases deben transmitir su propósito. Evita nombres de una sola letra (excepto para índices de bucles). Ejemplo:
fetchUserDataes mejor quegetData. - Tamaño de las funciones. Una función no debe hacer más de una cosa. Si tiene más de 20-30 líneas, es motivo para considerar una refactorización.
- Comentarios. Los comentarios deben explicar por qué el código está escrito de esa manera, no qué hace. Si un comentario duplica el código, elimínalo.
- Formato. Usa