ProgramaciónDesarrollador Backend TypeScript

Hable sobre el mecanismo de 'tipos de intersección' (intersection types) en TypeScript. ¿Cómo se utilizan correctamente y con qué trampas se puede topar?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

Los tipos de intersección (&, intersection types) permiten combinar varios tipos en uno que posea todas las propiedades de los tipos combinados.

Ejemplo:

type Person = { name: string }; type Worker = { job: string }; type WorkingPerson = Person & Worker; // { name: string; job: string } const wp: WorkingPerson = { name: "Leo", job: "Dev" };

Esto es útil al componer contratos ampliables y al construir tipos complejos a partir de primitivos.

Sin embargo, si se combinan tipos incompatibles (por ejemplo, type A = { foo: string } y type B = { foo: number }), se obtiene un tipo que no se puede inicializar.

Ejemplo de intersección incorrecta:

type A = { foo: string }; type B = { foo: number }; type C = A & B; // C = { foo: never }

Pregunta capciosa

¿Qué sucede si se combinan dos tipos que tienen el mismo campo con tipos de datos incompatibles?

Respuesta: Se obtendrá un campo con tipo never, ya que el valor no puede ser simultáneamente una cadena y un número. No se puede implementar un tipo así de forma válida.

type T1 = { id: string }; type T2 = { id: number }; type T3 = T1 & T2; // { id: never }

Ejemplos de errores reales debido al desconocimiento de las sutilezas del tema


Historia

En un proyecto se combinaron tipos de diferentes bibliotecas sin notar que había campos idénticos con diferentes tipos. Como resultado, se obtenía un tipo "imposible" (never) que llevaba a la imposibilidad de crear un objeto válido para enviar a la API.


Historia

A un desarrollador le necesitaba "conectar" tipos DTO y entidad de dominio. En la intersección se encontraron dos propiedades incompatibles, y al intentar usar el tipo resultante, se producían errores de compilación ambiguos. El desarrollador gastó tiempo en depuración antes de entender la causa.


Historia

En uno de los microservicios se declaró un tipo de intersección para describir el cuerpo de la solicitud. Debido a un cambio en la API, una de las propiedades recibió un tipo diferente, y los nuevos cambios no dieron lugar a un error de compilación inmediato; los problemas aparecieron solo en tiempo de ejecución después del despliegue.