Σε μια δήλωση μέθοδο στη γραφομηχανή, η παράμετρος θα μπορούσε να είναι του τύπου συστοιχίας των χορδών, booleans, ή αριθμούς. Έχω να το δηλώσει και κάθε [] ή είναι ένας τρόπος για να περιορίσει τον τύπο εισόδου ως επί αυτών των τριών τύπων εκεί;
Μπορώ Καθορίστε Παράμετρος Τύπος ως ένας από τους πολλούς τύπους Αντί οποιουδήποτε τύπου στη γραφομηχανή;
Γραφομηχανή 1.4 παρουσιάζει Τύποι Ένωσης , ώστε η απάντηση τώρα είναι ναι, μπορείς .
function myFunc(param: string[] | boolean[] | number[]): void;
Η χρήση άλλου τύπου από αυτές που καθορίζονται, θα προκαλέσει ένα σφάλμα μεταγλώττισης.
Αν θέλετε μια σειρά από πολλούς ειδικούς τύπους, μπορείτε να χρησιμοποιήσετε Τύποι Ένωσης και γι 'αυτό:
function myFunc(param: (string|boolean|number)[]): void;
Σημειώστε ότι αυτό είναι διαφορετικό από αυτό ΕΠ ζήτησε. Αυτά τα δύο παραδείγματα έχουν διαφορετικές σημασίες.
Αυτό φαίνεται λίγο παλιό θέμα, αλλά έτσι κι αλλιώς, ήρθα σε αυτό, και έχασε αυτή την άλλη απάντηση που φέρνω.
Από γραφομηχανή 1.4 φαίνεται ότι είναι δυνατόν να δηλώσει πολλούς πιθανούς τύπους για μια παράμετρο της λειτουργίας όπως αυτό:
class UtilsClass {
selectDom(element: string | HTMLElement):Array<HTMLElement> {
//Here will come the "magic-logic"
}
}
Αυτό είναι λόγω της νέας έννοιας γραφομηχανή της «ένωσης-τύπων».
Μπορείτε να δείτε περισσότερα εδώ .
Όχι γραφομηχανή υποστηρίζει μόνο ένα προαιρετικό TypeAnnotation σε μια παράμετρο, π.χ. x: string, αριθμός ή οποιοδήποτε, έτσι ώστε να μην μπορεί να δηλώσει ένα σύνολο επιτρεπόμενων ειδών.
Ωστόσο, γραφομηχανή υποστηρίζει υπερφόρτωση λειτουργία (τεκμηρίωση p51):
υπερφόρτωση Λειτουργία επιτρέψει μια πιο ακριβή περιγραφή των μοντέλων της επίκλησης που υποστηρίζονται από μια λειτουργία από ό, τι είναι δυνατό με ένα μόνο υπογραφή. [...]
function attr(name: string): string; function attr(name: string, value: string): Accessor; function attr(map: any): Accessor; function attr(nameOrMap: any, value: string): any { if (nameOrMap && typeof nameOrMap === "object") { // handle map case } else { // handle string case } }
Otherwsie μπορείτε να χρησιμοποιήσετε typeofτους ελέγχους τύπου, αλλά αυτό αντικρούει τον τύπο ascpect του Τύπου Script λίγο.
function myFunc(x){
if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number")
throw new TypeError("Unsupported type!");
}
Μπορείτε να χρησιμοποιήσετε υπερφορτώσεις λειτουργία για να το κάνετε αυτό:
class Thing {
public foo(x: number[]);
public foo(x: bool[]);
public foo(x: string[]);
public foo(x: any[]) {
// Note: You'll have to do type checking on 'x' manually
// here if you want differing behavior based on type
}
}
// Later...
var t = new Thing();
t.foo(someArray); // Note: External callers will not see the any[] signature
Ένας άλλος τρόπος για να επιλύσετε αυτό είναι να βρούμε τις κοινές μεθόδους και τις ιδιότητες των τύπων εισόδου και να δηλώσει έναν τύπο στη γραμμή στη δήλωση μέθοδο που κρατά αυτά τα κοινά methos και ιδιότητες. Σαν αυτό:
methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
Από χορδές, booleans και οι αριθμοί είναι πρωτόγονα είδη δεν νομίζω ότι υπάρχει ένας απλός τρόπος. Αν θέλετε να χρησιμοποιήσετε μια σειρά από διαφορετικούς τύπους αντικειμένων, θα μπορούσε ίσως να καταλήξει σε ένα σούπερ κατηγορία και στη συνέχεια καθορίστε ότι σούπερ τάξη στο περιβάλλον της μεθόδου σας. Από την άλλη πλευρά, θα μπορούσατε επίσης να χρησιμοποιήσετε τη μέθοδο υπερφόρτωση για να καθορίσετε διαφορετικές εφαρμογές για συστοιχίες των χορδών, booleans και ακέραιοι.













