Πώς να προσθέσετε μια μέθοδο σε έναν τύπο βάσης, λένε Array; Στην παγκόσμια ενότητα αυτή θα αναγνωριστεί
interface Array {
remove(o): Array;
}
αλλά πού να βάλει την πραγματική εφαρμογή;
Πώς να προσθέσετε μια μέθοδο σε έναν τύπο βάσης, λένε Array; Στην παγκόσμια ενότητα αυτή θα αναγνωριστεί
interface Array {
remove(o): Array;
}
αλλά πού να βάλει την πραγματική εφαρμογή;
Μπορείτε να χρησιμοποιήσετε το πρότυπο για την επέκταση Array:
interface Array<T> {
remove(o: T): Array<T>;
}
Array.prototype.remove = function (o) {
// code to remove "o"
return this;
}
declare globalφαίνεται να είναι το εισιτήριο από γραφομηχανή 2.1. Σημειώστε ότι Array.prototypeείναι του τύπου any[], οπότε αν θέλετε να έχετε την εφαρμογή σας λειτουργία ελέγχεται για τη συνοχή, καλύτερα να προσθέσετε μια γενική παράμετρος τύπου εαυτό σας.
declare global {
interface Array<T> {
remove(elem: T): Array<T>;
}
}
if (!Array.prototype.remove) {
Array.prototype.remove = function<T>(elem: T): T[] {
return this.filter(e => e !== elem);
}
}
Από γραφομηχανή 1.6, μπορείτε να «εγγενώς» επεκτείνει αυθαίρετη εκφράσεις όπως ενσωματωμένη τύπους.
Τι νέο υπάρχει στο γραφομηχανή :
Γραφομηχανή 1.6 προσθέτει υποστήριξη για τις κατηγορίες που εκτείνεται αυθαίρετες έκφρασης που υπολογίζει μια συνάρτηση κατασκευαστή. Αυτό σημαίνει ότι ενσωματωμένων τύπων μπορεί τώρα να επεκταθεί και στις δηλώσεις τάξη.
Το εκτείνεται ρήτρα μιας κατηγορίας απαιτείται προηγουμένως μια αναφορά τύπου που πρόκειται να καθοριστεί. Δέχεται τώρα μια έκφραση προαιρετικά ακολουθείται από μια λίστα ορισμάτων τύπου. Ο τύπος της έκφρασης πρέπει να είναι ένας τύπος συνάρτηση κατασκευαστή με τουλάχιστον ένα κατασκεύασμα υπογραφή που έχει τον ίδιο αριθμό των παραμέτρων τύπου καθώς ο αριθμός των επιχειρημάτων τύπου που καθορίζεται στην ενότητα εκτείνεται ρήτρα. Ο τύπος επιστροφής της υπογραφής (ες) ταιριάσματος κατασκεύασμα είναι ο τύπος βάσης από την οποία κληρονομεί ο τύπος τάξη παράδειγμα. Ουσιαστικά, αυτό επιτρέπει τόσο πραγματικό τάξεις και «τάξη-όπως» εκφράσεις που πρέπει να προσδιορίζονται στην εκτείνεται ρήτρα.
// Extend built-in types
class MyArray extends Array<number> { }
class MyError extends Error { }
// Extend computed base class
class ThingA {
getGreeting() { return "Hello from A"; }
}
class ThingB {
getGreeting() { return "Hello from B"; }
}
interface Greeter {
getGreeting(): string;
}
interface GreeterConstructor {
new (): Greeter;
}
function getGreeterBase(): GreeterConstructor {
return Math.random() >= 0.5 ? ThingA : ThingB;
}
class Test extends getGreeterBase() {
sayHello() {
console.log(this.getGreeting());
}
}
class MyArray<T> extends Array<T> {
remove: (elem: T) => Array<T> = function(elem: T) {
return this.filter(e => e !== elem);
}
}
let myArr = new MyArray<string>();
myArr.remove("some");
αυτό λειτουργεί για μένα με γραφομηχανή Ν2.2.1!
Προσθέτοντας σε απάντηση Ρίκκι Γκίμπσον,
export{}
declare global {
interface Array<T> {
remove(elem: T): Array<T>;
}
}
if (!Array.prototype.remove) {
Array.prototype.remove = function<T>(elem: T): T[] {
return this.filter(e => e !== elem);
}
}
Χωρίς την εξαγωγή {} TS σφάλμα «επαυξήσεις για την παγκόσμια εμβέλεια μπορεί να είναι ένθετα μόνο άμεσα σε εξωτερικές μονάδες ή δηλώσεις μονάδα περιβάλλοντος.»