2012-10-07 22 views
15

i prototipo de función extendida pero el mecanografiado no lo reconoce.¿Cómo se extiende el prototipo en mecanografiado?

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

resultado: TSC -e

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

¿Cómo se amplía este objeto?

Respuesta

33

Hay una interfaz de función en la lib del escrito mecanográfico estándar que declara los miembros de los objetos de la función. Tendrá que declarar proc como miembro de esa interfaz con su propio añadir en el siguiente aspecto: tendrá que ser referenciado

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

Esta interfaz desde cualquier lugar que vaya a utilizar 'proc'.

+0

¡thx !, ¡funciona! – mizchi

+10

considera marcarlo como una respuesta. –

+1

¿Cómo hacer esto con sus propias clases? –

6

De esta manera:

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

Sin 'declare global' no funciona.

Así es como funciona el aumento de módulos en versiones recientes de TypeScript. Consulte el documentation y desplácese hacia abajo hasta la sección Module augmentation.

+0

Ojalá pudieras explicar por qué, pero confirmo, lo mismo aquí. ¡Gracias! – Ludwik

+1

Así es como funciona el aumento de módulos en versiones recientes de TypeScript. Desplácese hacia abajo: https://www.typescriptlang.org/docs/handbook/declaration-merging.html – gaperton

0

Estoy agregando esto para desaconsejar agregar prototipos como el ejemplo que se muestra en cuestión, ya que muchas personas ven esta pregunta. Añadir la siguiente manera:

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

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

La razón es que si se agrega al prototipo directamente, se podría conseguir enumerado si una instancia de esa función de conseguir enumerado más. for i in ... Ahora este bloque podría estar en un código que no controlas (me pasó a mí recientemente), por lo que es mejor mantener tu código lo más seguro posible.

Cuestiones relacionadas