Los tipos de intersección (&, intersection types) permiten combinar varios tipos en uno que posea todas las propiedades de los tipos combinados.
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.
type A = { foo: string }; type B = { foo: number }; type C = A & B; // C = { foo: never }
¿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 }
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.