ProgrammationDéveloppeur Fullstack

Expliquez la différence entre les types never et void en TypeScript. Quand et pourquoi devriez-vous utiliser chacun d'eux ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

void et never en TypeScript sont des types différents :

  • void est généralement utilisé comme type de retour pour des fonctions qui ne retournent rien, c'est-à-dire que la fonction termine son exécution, mais ne renvoie aucune valeur.
  • never signifie qu'une fonction (ou une expression) ne se terminera jamais avec succès : soit elle lance toujours une exception, soit elle ne retourne jamais le contrôle (par exemple, une boucle infinie).

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

Question piège.

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.