Υπερφόρτωση Συναρτήσεων στο TypeScript
Μερικές φορές συναντάμε συναρτήσεις που επιστρέφουν τιμές, των οποίων ο τύπος εξαρτάται από τις παραμέτρους που μεταβιβάστηκαν. Για αυτό στο TypeScript χρησιμοποιούμε την υπερφόρτωση συναρτήσεων. Επιτρέπει να καθορίσουμε διαφορετικές εκδοχές υπογραφών της συνάρτησης.
Ας δούμε ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε μια συνάρτηση που χωρίζει τους χαρακτήρες ενός string σε έναν πίνακα γραμμάτων:
function splitStr(str: string): string[] {
return str.split('');
}
Ας υποθέσουμε επίσης ότι έχουμε μια συνάρτηση που χωρίζει τα ψηφία ενός αριθμού σε έναν πίνακα αριθμών:
function splitNum(num: number): number[] {
let str: string = String(num);
let arr: string[] = str.split('');
return arr.map(elem => +elem);
}
Ας συνδυάσουμε και τις δύο συναρτήσεις σε μία. Η νέα συνάρτηση, ανάλογα με τον τύπο της παραμέτρου, πρέπει να επιστρέφει είτε έναν πίνακα αριθμών είτε έναν πίνακα strings.
Ας χρησιμοποιήσουμε υπερφόρτωση για να δηλώσουμε τις διάφορες υπογραφές της συνάρτησής μας:
function splitVal(val: number): number[];
function splitVal(val: string): string[] {
// υλοποίηση και των δύο υπογραφών
}
Ας γράψουμε τώρα την υλοποίηση της συνάρτησης. στον κώδικά της πρέπει με μια συνθήκη να προσδιορίσουμε ποια από τις υπογραφές της συνάρτησης ενεργοποιήθηκε, και ανάλογα με αυτό να εκτελέσουμε τον σωστό κώδικα με αποτέλεσμα του σωστού τύπου:
function splitVal(val: number): number[];
function splitVal(val: string): string[] {
if (typeof val === 'string') {
return val.split('');
} else {
let str: string = String(val);
let arr: string[] = str.split('');
return arr.map((elem: string): number => +elem);
}
}
Σε αντίθεση με άλλες γλώσσες, στο TypeScript στην υπερφόρτωση δημιουργείται μία συνάρτηση. Δεν μπορείς να δημιουργήσεις πολλές συναρτήσεις με το ίδιο όνομα, αλλά με διαφορετικές υπογραφές.
Γράψτε μια συνάρτηση που θα επιστρέφει ή θα αλλάζει το κείμενο ενός στοιχείου DOM. Πρέπει να λειτουργεί ως εξής:
text('#elem', 'text'); // θα ορίσει το κείμενο
text('#elem'); // θα επιστρέψει το τρέχον κείμενο