Code review en TypeScript: qué revisar y cómo dar retroalimentación en la práctica
\n\nEl code review no es solo una formalidad, sino una herramienta poderosa para mejorar la calidad del código. En TypeScript, con su rico sistema de tipos, la revisión puede ser especialmente efectiva. En este artículo, analizaremos en qué fijarse al revisar código TypeScript y cómo dar retroalimentación para que sea útil, no ofensiva. Todos los ejemplos son con código real.
\n\n1. Tipos y anotaciones: evita `any` y usa el rigor
\n\nLo primero que salta a la vista en una revisión de código TypeScript son los tipos. TypeScript está diseñado para detectar errores en tiempo de compilación, por lo que any es una bandera roja.
Qué revisar:
\n- \n
- Presencia de
any. Cadaanydebe estar justificado. Si es una migración desde JS, está bien, pero en código nuevo, no. \n - Corrección de los tipos. No uses
stringdonde se necesita unenumo ununion type. \n - Tipado excesivo. TypeScript puede inferir tipos. No escribas
const x: number = 5— escribeconst x = 5. \n - Configuraciones estrictas. Verifica que en
tsconfig.jsonestén habilitadosstrict: true,noImplicitAny,strictNullChecks. \n
Ejemplo de código malo:
\nfunction processData(data: any) {\n return data.name.toLowerCase();\n}\n\nCómo corregirlo:
\ninterface User {\n name: string;\n}\n\nfunction processData(data: User): string {\n return data.name.toLowerCase();\n}\n\nCómo dar retroalimentación:
\nEn lugar de «Estás usando any, eso es malo», di: «Aquí any desactiva la verificación de tipos. Describamos la interfaz User — esto mejorará la seguridad y legibilidad del código».
2. Trabajo con null y undefined: strictNullChecks salva vidas
\n\nLos errores Cannot read property of undefined son clásicos. TypeScript con strictNullChecks ayuda a evitarlos, pero solo si el desarrollador maneja correctamente los valores nullable.
Qué revisar:
\n- \n
- Verificación de null/undefined antes de acceder a propiedades. \n
- Uso de optional chaining (
?.) — es moderno y seguro. \n - Operador
!(non-null assertion) — úsalo solo si estás 100% seguro de que el valor no es null. Es mejor reemplazarlo con una verificación explícita. \n - Uso correcto de
??(nullish coalescing) en lugar de||para valores por defecto. \n
Ejemplo de código malo:
\nfunction getCity(user: User | null): string {\n return user!.address!.city; // ¡Peligroso!\n}\n\nCómo corregirlo:
\nfunction getCity(user: User | null): string {\n return user?.address?.city ?? 'Unknown';\n}\n\nCómo dar retroalimentación:
\n«El uso de ! aquí es riesgoso — si user resulta ser null, se producirá un error. Reemplacémoslo con ?. y ?? — es seguro y legible».
3. Genéricos y tipos utilitarios: no compliques sin necesidad
\n\nLos genéricos son una característica poderosa, pero es fácil complicarlos demasiado. El revisor debe buscar un equilibrio entre flexibilidad y legibilidad.
\n\nQué revisar:
\n- \n
- Complejidad excesiva. Si un genérico se usa solo una vez, quizás no sea necesario. \n
- Uso correcto de
extends— restringe los genéricos para que no acepten cualquier cosa. \n - Tipos utilitarios (
Partial,Pick,Omit,Record) — su uso simplifica el código. \n - Tipos de valores de retorno — una función con genéric