Hoe werkt prototype uit te breiden op typoscript?

stemmen
15

Ik verlengde functie prototype maar typoscript erkent het niet.

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

resultaat: TSC -e

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

Hoe verleng dit object?

De vraag is gesteld op 07/10/2012 om 05:27
bron van user
In andere talen...                            


4 antwoorden

stemmen
33

Er is een functie-interface in de standaard typoscript lib waarin de leden van Function objecten verklaart. U moet proc verklaren als een lid van die interface met uw eigen add-on als volgt uit:

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

Deze interface zal moeten worden verwezen vanuit overal u van plan bent om 'proc' te gebruiken.

antwoordde op 07/10/2012 om 19:03
bron van user

stemmen
6

Zoals dit:

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

Zonder 'verklaren global' het niet werkt.

Dat is hoe module vergroting werkt in de afgelopen getypte versies. Check out de documentatie en scroll naar beneden naar de Module augmentationsectie.

antwoordde op 25/06/2016 om 05:00
bron van user

stemmen
0

Gewoon toe te voegen dat als je probeert toe te voegen iets dat al is verklaard te definiëren, dan is dit de Typesafe manier om dit te doen, die ook bescherming biedt tegen buggy for inimplementaties.

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

Die kan worden gebruikt om veilig Polyfill. Voorbeeld

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

Helaas kan het niet uw Symbols typecheck als gevolg van een beperking in de huidige TS , en het zal niet tegen je schreeuwen als de tekenreeks niet overeenkomt met een definitie voor een of andere reden, ik zal de bug na het zien te melden als ze al bewust.

antwoordde op 26/03/2019 om 02:25
bron van user

stemmen
0

Ik voeg dit te adviseren tegen het toevoegen prototypes zoals de getoonde afbeelding in kwestie aangezien veel mensen bekijken van deze vraag voorbeeld. Voeg het als volgt:

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

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

De reden is als je het naar de prototype rechtstreeks toe te voegen, kan het nog genoemd als een instantie van die functie get voorbij is opgesomd. for i in ... Nu dit blok zou kunnen zijn in een code die je niet onder controle (recentelijk gebeurd voor mij), dus het is best om uw code zo veilig mogelijk te houden.

antwoordde op 02/05/2017 om 22:52
bron van user

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