Είναι ένας τρόπος για να προσθέσετε μεθόδους on the fly σε μια τάξη με τη χρήση γραφομηχανή εκεί;

ψήφοι
17

Είμαι προσπαθεί να δημιουργήσει κάποιο είδος Μίχίη μέθοδο που προσθέτουν μεθόδους για το πρωτότυπο / κλάση on the fly, αλλά παίρνω λάθη, όπως

Το ακίνητο «greetName» δεν υπάρχει στην αξία του τύπου «Greeter» κάθε

και

Το ακίνητο «greetName» δεν υπάρχει στην αξία του τύπου «Greeter» κάθε

όταν τρέχω τον ακόλουθο κώδικα.

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return Hello,  + this.greeting;
    }
}

Greeter.prototype.greetName = function(name){
        return this.greet() + ' ' + name;
}

var greeter = new Greeter('Mr');

window.alert(greeter.greetName('Name'));

Συντάσσει στην πραγματικότητα να ισχύει js και εκτελείται όπως αναμένεται. Υπάρχει τρόπος να το κάνουμε αυτό με τις προειδοποιήσεις compiler / λάθη υπάρχουν;

Δημοσιεύθηκε 02/10/2012 στις 22:49
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
15

Η λύση αυτή έχει το πλεονέκτημα ότι δίνει πληκτρολογείτε τον έλεγχο όταν δυναμικά προσθέσετε μια μέθοδο:

class MyClass {
    start() {

    }
}
var example = new MyClass();
// example.stop(); not allowed


interface MyClass {
  stop(): void;
}

MyClass.prototype['stop'] = function () {
    alert('Stop');
}
var stage2 = example;
stage2.stop();
Απαντήθηκε 06/06/2013 στις 17:02
πηγή χρήστη

ψήφοι
8

Υπάρχει ένας άλλος τρόπος για να γίνει αυτό.

Greeter["SomeProperty"] = function() {
     return "somevalue";
};

Λειτουργεί το ίδιο και χρησιμοποιεί τη λειτουργία ευρετήριο ακίνητο σε javascript και γραφομηχανή δεν διαμαρτύρονται.

Απαντήθηκε 19/12/2012 στις 16:06
πηγή χρήστη

ψήφοι
8

Θα χρειαστεί μια ιδέα της μερικής μαθήματα για αυτό το έργο το οποίο προς το παρόν δεν υποστηρίζεται. Θα σας πω ότι αυτό που έχω βρεθεί λειτουργεί καλύτερα για αυτούς τους τύπους των σεναρίων είναι να χρησιμοποιήσει τις διασυνδέσεις αντί (έχω προγραμματισμό σε γραφομηχανή για περίπου 6 μήνες τώρα - είμαι στο MS αλλά όχι στην ομάδα γραφομηχανή)

Διασυνδέσεις είναι επεκτάσιμη μετά το γεγονός με απλά definging τις μεθόδους που θέλετε να προσθέσετε στο περιβάλλον. Ως παράδειγμα, αν εγκαταστήσετε ένα plugin jQuery θα θελήσετε να επαναπροσδιορίσει τη διεπαφή IJQuery & IJQueryUtil να συμπεριλάβει τα plugins πρόσθετες μεθόδους. Από εκείνο το σημείο και μετά μπορείτε να επικαλεστεί τις μεθόδους plugins μέσα από $ .plugin () και γραφομηχανή θα είναι ευτυχισμένος.

Απαντήθηκε 02/10/2012 στις 23:22
πηγή χρήστη

ψήφοι
1

Παρόμοια με @Fenton παράδειγμα, αλλά χωρίς την οζώδης πράγματα:

class MyClass {
    start() {
    }
}
MyClass.prototype['stop'] = function () {
    alert('Stop');
}

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Απαντήθηκε 26/05/2018 στις 14:16
πηγή χρήστη

ψήφοι
0

Αυτό είναι το πώς RxJSτο κάνει

import {Observable} from "./observable"; // which is Greeter in your case 


declare module "./observable" {
    interface Observable<T> {
        map<U>(f: (x: T) => U): Observable<U>;
    }
}

Observable.prototype.map = function (f) {

}

Αυτό ονομάζεται Ενότητα Αύξηση.

Απαντήθηκε 23/10/2018 στις 00:21
πηγή χρήστη

ψήφοι
0

Αφού την εφαρμογή δυναμικές μεθόδους και τις ιδιότητες για τις κατηγορίες, αυτή ήταν η λύση ήμουν σε θέση να πάει με την πρόληψη γραφομηχανή compiler από διαμαρτύρεται:

...
window.alert(greeter['greetName']('Name'));

Βασικά, χρησιμοποιήστε τη μέθοδο βραχίονα της accessors ιδιοκτησίας .

Απαντήθηκε 26/08/2016 στις 01:56
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more