img attribute javascript typescript

javascript - attribute - ¿Cómo se extiende el prototipo en mecanografiado?



title javascript (4)

Estoy agregando esto para desaconsejar agregar prototipos como el ejemplo que se muestra en la pregunta ya que muchas personas ven esta pregunta. Agrégalo de 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 lo agrega al prototipo directamente, podría enumerar si una instancia de esa función se enumera nuevamente. for i in .. Ahora este bloque podría estar en un código que no controlas (recientemente me sucedió), por lo que es mejor mantener tu código lo más seguro posible.

Extendí el 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: tsc -e

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

¿Cómo extiendo este objeto?


Hay una interfaz de función en la biblioteca de escritura estándar que declara los miembros de los objetos de función. Deberá declarar proc como miembro de esa interfaz con su propio complemento como el siguiente:

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

Será necesario hacer referencia a esta interfaz desde cualquier lugar donde pretenda utilizar ''proc''.


Me gusta esto:

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

Sin ''declarar global'' no funciona.

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


Solo agregando que si está tratando de agregar definir algo que ya está declarado, entonces esta es la forma segura de hacerlo, que también protege contra errores for in implementaciones.

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 se puede utilizar para poli-relleno de forma 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); }

Desafortunadamente, no puede revisar sus Símbolos debido a una limitación en el TS actual , y no le gritará si la cadena no coincide con ninguna definición por alguna razón, informaré el error después de ver si ya están consciente.