En TypeScript, la surcharge de fonctions est réalisée par la déclaration de plusieurs signatures de fonction avec des types et/ou un nombre d'arguments différents, mais avec une seule implémentation.
La principale caractéristique : il n'y a toujours qu'une seule implémentation, et le compilateur vérifie que l'appel correspond à l'une des signatures déclarées.
function greet(person: string): string; function greet(person: string, age: number): string; function greet(person: string, age?: number): string { if (age !== undefined) { return `Bonjour, ${person}. Vous avez ${age} ans !`; } else { return `Bonjour, ${person} !`; } } greet('Alice'); // 'Bonjour, Alice !' greet('Bob', 32); // 'Bonjour, Bob. Vous avez 32 ans !'
⚠️ Contrairement à C# ou Java, il n'y a pas plusieurs implémentations de la fonction — toutes les signatures se résolvent en une seule fonction avec vérification obligatoire à l'intérieur.
Est-il nécessaire de réaliser chaque signature surchargée en TypeScript sous forme de fonction distincte, comme par exemple en C# ?
Réponse : Non ! En TypeScript, il n'existe qu'une seule implémentation pour une fonction surchargée. Toutes les variations sont définies par un ensemble de déclarations de signatures. C'est l'implémentation qui doit gérer elle-même les différentes variantes des paramètres d'entrée à l'intérieur d'une seule fonction.
Histoire
Dans un projet, un développeur a déclaré deux fonctions avec le même nom, s'attendant à une surcharge, comme en Java. Au final, seule la dernière fonction définie fonctionnait, et les autres étaient "écrasées". Cela a entraîné des erreurs inattendues dans le fonctionnement et d'énormes pertes de temps pour le refactoring.
Histoire
Une vérification de types correcte n'a pas été mise en œuvre dans l'implémentation de la fonction surchargée. La fonction renvoyait périodiquement des valeurs d'un type différent de ce que les clients attendaient, ce qui a rendu difficile la détection de l'erreur en raison du fait que TypeScript ne valide pas l'implémentation des surcharges.
Histoire
Une implémentation de la surcharge a été utilisée uniquement au niveau des types (des signatures ont été déclarées), mais la compatibilité avec l'implémentation runtime n'a pas été assurée (absence de paramètres optionnels et de traitements à l'intérieur de la fonction). Cela a conduit à des pannes lors d'appels avec des paramètres "valide au type", car le runtime ne supportait pas ces variantes.