void et never en TypeScript sont des types différents :
Exemples :
function log(message: string): void { console.log(message); } function throwError(message: string): never { throw new Error(message); } function infinite(): never { while (true) {} }
never est souvent utilisé pour contrôler la complétude du switch-case par types :
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; // Le compilateur va indiquer ici s'il manque un cas } }
Les types void et never peuvent-ils être utilisés de manière interchangeable comme types de retour de fonction ?
Réponse : Non. Une fonction de type void retourne undefined ou ne retourne rien, mais termine son exécution. Une fonction de type never ne termine jamais son exécution avec succès (elle lance une erreur ou entre dans une boucle infinie).
Exemple :
const fn: () => never = () => { // return; // Erreur : Une fonction dont le type déclaré est 'never' ne doit pas retourner. };
Histoire
Dans un système d'analyse, la fonction validateur était typée avec un type de retour void, bien qu'elle lance toujours une exception. En conséquence, les développeurs pensaient que la fonction pouvait "retourner" et ne faisaient pas de vérifications ultérieures, ce qui a conduit à un manque de gestion des erreurs et à une mauvaise implémentation de la chaîne d'appels.
Histoire
Dans un des projets, la fonction TypeScript, attendue avec un type de retour strictement typé, a été définie comme retournant never au lieu de void. Cela a provoqué des erreurs lors de l'appel d'une fonction avec un callback typé comme never, entraînant des erreurs de compilation et une perte de compatibilité API.
Histoire
Dans un module backend, les exceptions étaient auparavant lancées par une fonction avec un type de retour void. Après la migration vers TypeScript, le compilateur ne prévenait pas de la sortie du code après l'appel de cette fonction, ce qui a conduit à des lignes de code "inaccessibles" — et seul le changement du type de retour en never a permis de détecter ces endroits et de rendre le code plus propre, évitant une erreur logique.