Πώς πρωτότυπο επεκταθεί σε γραφομηχανή;

ψήφοι
15

i επεκταθεί η λειτουργία πρωτότυπο, αλλά γραφομηχανή δεν το αναγνωρίζει.

Function.prototype.proc = function() {
  var args, target, v;
  var __slice = [].slice;
  args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
  target = this;
  while (v = args.shift()) {
    target = target(v);
  }
  return target;
};
// generated by coffee-script

var foo: (number) => (string) => number
  = (a) => (b) => a * b.length;
console.log(foo.proc(first, second))

Αποτέλεσμα: -e TSC

The property 'proc' does not exist on value of type 'Function'

Πώς μπορώ να επεκτείνει αυτό το αντικείμενο;

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


4 απαντήσεις

ψήφοι
33

Υπάρχει μια διεπαφή λειτουργίας στο πρότυπο γραφομηχανή lib που δηλώνει τα μέλη των αντικειμένων Λειτουργία. Θα πρέπει να δηλώσουν proc ως μέλος αυτής της διασύνδεσης με το δικό σας προσθέτουν επάνω όπως τα εξής:

interface Function {
    proc(...args: any[]): any;
}

Αυτή η διεπαφή θα πρέπει να αναφέρεται από οπουδήποτε σκοπεύετε να χρησιμοποιήσετε το «proc».

Απαντήθηκε 07/10/2012 στις 19:03
πηγή χρήστη

ψήφοι
6

Σαν αυτό:

declare global {
    interface Function {
        proc() : any;
    }
}

Χωρίς να «κηρύξει παγκόσμια» δεν λειτουργεί.

Αυτό είναι το πώς λειτουργεί μονάδα αύξηση στις πρόσφατες εκδόσεις γραφομηχανή. Ελέγξτε την τεκμηρίωση και μετακινηθείτε προς τα κάτω στην Module augmentationενότητα.

Απαντήθηκε 25/06/2016 στις 05:00
πηγή χρήστη

ψήφοι
0

Απλά προσθέτοντας ότι εάν προσπαθείτε να προσθέσετε καθορίσει κάτι που έχει ήδη δηλωθεί, τότε αυτό είναι το typesafe τρόπος για να γίνει αυτό, που προστατεύει επίσης έναντι λάθη for inεφαρμογές.

export const augment = <U extends (string|symbol), T extends {[key :string] :any}>(
    type  :new (...args :any[]) => T,
    name  :U,
    value :U extends string ? T[U] : any
) => {
    Object.defineProperty(type.prototype, name, {writable:true, enumerable:false, value});
};

Ποια μπορεί να χρησιμοποιηθεί για να polyfill με ασφάλεια. Παράδειγμα

//IE doesn't have NodeList.forEach()
if (!NodeList.prototype.forEach) {
    //this errors, we forgot about index & thisArg!
    const broken = function(this :NodeList, func :(node :Node, list :NodeList) => void) {
        for (const node of this) {
            func(node, this);
        }
    };
    augment(NodeList, 'forEach', broken);

    //better!
    const fixed = function(this :NodeList, func :(node :Node, index :number, list :NodeList) => void, thisArg :any) {
        let index = 0;
        for (const node of this) {
            func.call(thisArg, node, index++, this);
        }
    };
    augment(NodeList, 'forEach', fixed);
}

Δυστυχώς δεν μπορεί να typecheck Σύμβολα σας οφείλεται σε περιορισμό στην τρέχουσα TS , και δεν θα φωνάζω σε σας, αν το string δεν ταιριάζει με κανένα ορισμό για κάποιο λόγο, θα αναφέρετε το σφάλμα μετά από να δει αν είναι ήδη ενήμερος.

Απαντήθηκε 26/03/2019 στις 02:25
πηγή χρήστη

ψήφοι
0

Είμαι προσθέτοντας αυτό να παρέχει συμβουλές κατά την προσθήκη πρωτότυπα, όπως το παράδειγμα που παρουσιάζεται στο ερώτημα δεδομένου ότι πολλοί άνθρωποι βλέπουν αυτό το θέμα. Προσθήκη ως εξής:

interface Function {
    proc(...args: any[]): any;
}

Object.defineProperty(Function.prototype, 'proc', { value: function(arg: any[]) {
    // Your function body
}});

Ο λόγος είναι, αν το προσθέσετε στο πρωτότυπο άμεσα, θα μπορούσε να πάρει απαριθμούνται όταν μια περίπτωση που παίρνουν λειτουργία του απαριθμούνται πάνω. for i in ... Τώρα, αυτό το μπλοκ θα μπορούσε να είναι ένα κωδικό που δεν ελέγχουν (πρόσφατα συνέβη σε μένα), οπότε είναι καλύτερο να κρατήσετε τον κωδικό σας όσο το δυνατόν ασφαλέστερο.

Απαντήθηκε 02/05/2017 στις 22:52
πηγή χρήστη

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