2012-10-07 2 views
15

ho esteso il prototipo di funzione ma il dattiloscritto non lo riconosce.Come si estende il prototipo al dattiloscritto?

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

risultato: TSC -e

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

Come posso estendere questo oggetto?

risposta

33

C'è un'interfaccia Function nella lib di dattiloscritto standard che dichiara i membri degli oggetti Function. Avrete bisogno di dichiarare proc come membro di tale interfaccia con il proprio add on come la seguente: dovrà essere fatto riferimento

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

Questa interfaccia da qualsiasi luogo che si intende utilizzare 'proc'.

+0

thx !, funziona! – mizchi

+10

considera di contrassegnarlo come risposta. –

+1

Come fare questo con le tue classi? –

6

Ti piace questa:

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

Senza 'Declare globale' non funziona.

Ecco come la conversione dei moduli funziona nelle versioni TypeScript recenti. Controlla il documentation e scorri verso il basso fino alla sezione Module augmentation.

+0

Spero che tu possa spiegare perché, ma confermo, lo stesso qui. Grazie! – Ludwik

+1

Ecco come funziona la conversione dei moduli nelle recenti versioni di TypeScript. Scorri verso il basso: https://www.typescriptlang.org/docs/handbook/declaration-merging.html – gaperton

0

Sto aggiungendo questo per sconsigliare l'aggiunta di prototipi come l'esempio mostrato in questione poiché molte persone vedono questa domanda. Aggiungi come segue:

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

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

La ragione è che se si aggiunge al prototipo direttamente, si potrebbe ottenere enumerati se un'istanza di tale funzione get di enumerati sopra. for i in ... Ora questo blocco potrebbe essere in un codice che non controlli (mi è successo di recente), quindi è meglio mantenere il tuo codice il più sicuro possibile.