Hogyan prototípus húzódnak géppel?

szavazat
15

i kiterjesztett függvény prototípus, de géppel nem ismeri fel.

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

eredmény: TSC -e

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

Hogyan lehet kiterjeszteni ezt a tárgyat?

A kérdést 07/10/2012 05:27
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
33

Van egy funkció felület a szabványos géppel lib amely kijelenti, a tagok Function tárgyakat. Meg kell, hogy állapítsa meg proc tagjaként, amely érintkezik a saját hozzá a következőképpen néz ki:

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

Ez az interfész kell hivatkozni bárhonnan a használni kívánt „proc”.

Válaszolt 07/10/2012 19:03
a forrás felhasználó

szavazat
6

Mint ez:

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

Anélkül „állapítsa meg a globális” ez nem működik.

Így modul mellnagyobbítás működik az utóbbi géppel változatban. Tekintse meg a dokumentációt , és görgessen az Module augmentationoldalunkon.

Válaszolt 25/06/2016 05:00
a forrás felhasználó

szavazat
0

Csak hozzátéve, hogy ha megpróbálja felvenni meghatározni valamit, ami már bejelentett, akkor ez a typesafe módja ennek, amely szintén véd a hibás for inmegvalósítások.

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

Amelyeket fel lehet használni, hogy biztonságosan Polyfill. Példa

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

Sajnos ez nem typecheck a szimbólumok miatt korlátozás jelenlegi TS , és ez nem fog kiabálni, ha a húr nem egyezik meghatározása valamilyen okból, én a hiba bejelentése, miután látta, ha már tudatában.

Válaszolt 26/03/2019 02:25
a forrás felhasználó

szavazat
0

Én ezt hozzá kell adni tanácsot ellen hozzátéve prototípusokat, mint látható példában a kérdést, hiszen sokan nézet ezt a kérdést. Add meg az alábbiak szerint:

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

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

Ennek az az oka, ha azt felveszi a prototípus közvetlenül, akkor is kap felsorolt ha egy példánya, amely funkció get a felsorolt felett. for i in ... Most ez a mondat lehetne a kódot nem ellenőrizzük (a közelmúltban történt velem), így a legjobb, hogy a kódot a lehető legbiztonságosabban.

Válaszolt 02/05/2017 22:52
a forrás felhasználó

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