void y never en TypeScript son tipos diferentes:
Ejemplos:
function log(message: string): void { console.log(message); } function throwError(message: string): never { throw new Error(message); } function infinite(): never { while (true) {} }
never se utiliza frecuentemente para controlar la exhaustividad de switch-case por tipos:
type Shape = { kind: 'circle' } | { kind: 'square' }; function getArea(shape: Shape) { switch (shape.kind) { case 'circle': return 1; case 'square': return 2; default: const _exhaustive: never = shape; // Aquí el compilador indicará si se ha omitido un caso } }
¿Pueden void y never usarse de manera intercambiable como tipos de retorno de función?
Respuesta: No. Una función con tipo void devuelve undefined o no devuelve nada, pero finaliza su ejecución. Una función con tipo never nunca termina la ejecución exitosamente (lanza un error o entra en un bucle infinito).
Ejemplo:
const fn: () => never = () => { // return; // Error: Una función cuyo tipo declarado es 'never' no debe retornar. };
Historia
En el sistema analítico, se tipificó la función validadora con un tipo de retorno void, aunque siempre lanzaba una excepción. Como resultado, los desarrolladores creían que la función podría "volver" y no realizaban más verificaciones, lo que llevó a omitir el manejo de errores y a implementar incorrectamente la cadena de llamadas.
Historia
En uno de los proyectos, la función de TypeScript, que esperaba un tipo de retorno claramente tipificado, se definió como retornando never, en lugar de void. Debido a esto, intentar llamar a la función con un callback que estaba tipificado como never resultó en errores de compilación y pérdida de compatibilidad de API.
Historia
En el módulo de backend antes se lanzaba una excepción a través de una función con un tipo de retorno void. Después de migrar a TypeScript, el compilador no advertía sobre salir de los límites del código después de llamar a esta función, lo que llevó a líneas adicionales de código "inalcanzable"; y solo cambiar el tipo de retorno a never permitió detectar tales lugares y limpiar el código, evitando un error lógico.