ProgramaciónDesarrollador Fullstack

Explique la diferencia entre los tipos never y void en TypeScript. ¿Cuándo y por qué deberías usar cada uno de ellos?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

void y never en TypeScript son tipos diferentes:

  • void se utiliza normalmente como tipo de retorno para funciones que no devuelven nada, es decir, la función termina su ejecución pero no devuelve un valor.
  • never significa que la función (o expresión) nunca finalizará exitosamente: o siempre lanza una excepción, o nunca devuelve el control (por ejemplo, un bucle infinito).

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 } }

Pregunta trampa.

¿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.