ProgrammationDéveloppeur Frontend

Comment réaliser une surcharge de fonctions (function overloading) en TypeScript et en quoi la surcharge diffère-t-elle de celle d'autres langages, par exemple C# ou Java ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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.

Exemple:

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.

Question piège

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.

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


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.