¿Cómo prototipo se extienden en texto mecanografiado?

votos
15

Extendí prototipo de función, pero mecanografiado no lo reconoce.

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: -e TSC

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

¿Cómo se amplía este objeto?

Publicado el 07/10/2012 a las 05:27
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
33

Hay una interfaz de funciones en el lib mecanografiado norma que declara los miembros de objetos de función. Tendrá que declarar proc como miembro de esa interfaz con su propio añadir en el siguiente aspecto:

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

necesitará esta interfaz se pueden consultar desde cualquier lugar que vaya a utilizar 'proc'.

Respondida el 07/10/2012 a las 19:03
fuente por usuario

votos
6

Me gusta esto:

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

Sin 'declarar mundial' no funciona.

Así es como el aumento del módulo funciona en las versiones recientes mecanografiado. Echa un vistazo a la documentación y vaya a la Module augmentationsección.

Respondida el 25/06/2016 a las 02:00
fuente por usuario

votos
0

Simplemente añadiendo que si usted está tratando de añadir a definir algo que ya se declaró, entonces esta es la manera de hacerlo typesafe, que también protege contra cochecillo for inimplementaciones.

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});
};

Que puede ser utilizado para polyfill segura. Ejemplo

//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);
}

Por desgracia, no puede typecheck sus símbolos debido a una limitación en el TS actuales , y no va a gritarte si la cadena no coincide con ninguna definición, por alguna razón, voy a informar el error después de ver si ya están consciente.

Respondida el 26/03/2019 a las 02:25
fuente por usuario

votos
0

Estoy añadiendo esto a desaconsejar la adición de 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 enumeró más. for i in ... Ahora bien, este bloque podría estar en un código que no controlas (recientemente pasó a mí), así que lo mejor es mantener el código lo más seguro posible.

Respondida el 02/05/2017 a las 19:52
fuente por usuario

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