Qu'est-ce que la surcharge de fonctions en général?
La surcharge de fonctions ou la surcharge de méthodes est la possibilité de créer plusieurs fonctions du même nom avec différentes implémentations ( Wikipedia )
Qu'est-ce que la surcharge de fonctions dans JS?
Cette fonctionnalité n'est pas possible dans JS - la dernière fonction définie est prise en cas de déclarations multiples:
function foo(a1, a2) { return `${a1}, ${a2}` }
function foo(a1) { return `${a1}` } // replaces above `foo` declaration
foo(42, "foo") // "42"
... et en TS?
Les surcharges sont une construction à la compilation sans impact sur le runtime JS:
function foo(s: string): string // overload #1 of foo
function foo(s: string, n: number): number // overload #2 of foo
function foo(s: string, n?: number): string | number {/* ... */} // foo implementation
Une erreur d'implémentation en double est déclenchée si vous utilisez le code ci-dessus (plus sûr que JS). TS choisit la première surcharge de montage dans l'ordre descendant, de sorte que les surcharges sont triées du plus spécifique au plus large.
Surcharge de méthode dans TS: un exemple plus complexe
Les types de méthode de classe surchargés peuvent être utilisés de manière similaire pour surcharger les fonctions:
class LayerFactory {
createFeatureLayer(a1: string, a2: number): string
createFeatureLayer(a1: number, a2: boolean, a3: string): number
createFeatureLayer(a1: string | number, a2: number | boolean, a3?: string)
: number | string { /*... your implementation*/ }
}
const fact = new LayerFactory()
fact.createFeatureLayer("foo", 42) // string
fact.createFeatureLayer(3, true, "bar") // number
Les surcharges très différentes sont possibles, car l'implémentation de la fonction est compatible avec toutes les signatures de surcharge - imposées par le compilateur.
Plus d'infos: