never es el tipo que representa algo que nunca debería ocurrir. Es el tipo vacío — ningún valor puede ser never.
Si una función siempre lanza un error o tiene un loop infinito, su tipo de retorno es never.
El uso más práctico de never es verificar que has manejado todos los casos de una union. Se llama exhaustive checking:
En el default, luz debería ser never porque ya cubrimos todos los casos. Si añadimos un nuevo valor a Semaforo (como "intermitente") y olvidamos manejarlo, TypeScript da error:
TypeScript te dice: "hay un caso que no manejaste". Esto es increíblemente útil para prevenir bugs.
TypeScript va descartando tipos en cada case:
Después de cubrir todos los casos, el único tipo posible es never. Si queda algo sin cubrir, ese "algo" no se puede asignar a never y TypeScript protesta.
Imagina que tienes un sistema con discriminated unions y varios desarrolladores:
Si alguien añade | { tipo: "webhook"; url: string } a la union, el default dará error de compilación hasta que se añada el case "webhook". Ningún caso se escapa.
Partiendo del código de formas geométricas (Círculo, Rectángulo, Triángulo):
Trapecio con baseMayor, baseMenor y alturaForma"trapecio" en el switchdefault con exhaustive check usando never(baseMayor + baseMenor) * altura / 2never es el canario en la mina del sistema de tipos. Si dejas un caso sin manejar, never avisa antes de que el bug llegue a producción.