2012-10-07 7 views
15

Ich erweiterte Funktion Prototyp, aber Typoskript erkennt es nicht.Wie erstreckt sich Prototyp auf Typoskript?

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")) 

Ergebnis: tsc-

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

Wie erweitere ich dieses Objekt?

Antwort

33

Es gibt eine Function-Schnittstelle in der Standard typescript-Bibliothek, die die Member von Function-Objekten deklariert. Sie müssen proc erklären, als ein Mitglied dieser Schnittstelle mit Ihrem eigenen Add-on wie folgt aus:

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

Diese Schnittstelle muss von überall referenziert werden Sie beabsichtigen ‚proc‘ zu verwenden.

+0

thx !, es funktioniert! – mizchi

+10

Betrachten Sie es als eine Antwort. –

+1

Wie geht das mit Ihren eigenen Klassen? –

6

So:

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

Ohne 'declare global' es funktioniert nicht.

So funktioniert die Modulerweiterung in aktuellen TypeScript-Versionen. Überprüfen Sie die documentation und scrollen Sie nach unten zum Module augmentation Abschnitt.

+0

Ich wünschte, Sie könnten erklären, warum, aber ich bestätige, gleich hier. Vielen Dank! – Ludwik

+1

So funktioniert die Modulerweiterung in aktuellen TypeScript-Versionen. Scrollen Sie nach unten: https://www.typescriptlang.org/docs/handbook/declaration-merging.html – gaperton

0

Ich füge das hinzu, um zu raten, Prototypen wie das in Frage gezeigte Beispiel hinzuzufügen, da viele Leute diese Frage betrachten. Fügen Sie es wie folgt:

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

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

Der Grund dafür ist, wenn Sie es mit dem Prototyp direkt hinzufügen, könnte es, wenn eine Instanz dieser Funktion gets aufgezählt über get aufgezählt. for i in ... Jetzt könnte dieser Block in einem Code sein, den du nicht kontrollierst (vor kurzem ist mir passiert), also ist es am besten, deinen Code so sicher wie möglich zu halten.

Verwandte Themen