Wie funktioniert Prototyp auf Typoskript verlängern?

stimmen
15

i erweiterte Funktionsprototyp aber Typoskript erkennt sie nicht.

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

Ergebnis: tsc -e

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

Wie kann ich das Objekt erweitern?

Veröffentlicht am 07/10/2012 um 05:27
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
33

Es gibt eine Funktion Schnittstelle im Standard Typoskript lib, die die Mitglieder der Funktionsobjekte deklariert. Sie werden proc als Mitglied dieser Schnittstelle mit Ihrem eigenen Add-On wie folgt erklären müssen:

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

Diese Schnittstelle müssen referenziert werden von überall Sie verwenden ‚proc‘ beabsichtigen.

Beantwortet am 07/10/2012 um 19:03
quelle vom benutzer

stimmen
6

So was:

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

Ohne ‚erklären globale‘ es funktioniert nicht.

Das ist , wie funktioniert Modul Augmentation in den letzten Typoskript Versionen. Schauen Sie sich die aus Dokumentation und navigieren Sie zu dem unten Module augmentationAbschnitt.

Beantwortet am 25/06/2016 um 05:00
quelle vom benutzer

stimmen
0

Nur fügte hinzu , dass , wenn Sie versuchen , etwas hinzuzufügen zu definieren, der bereits erklärt hat, dann ist dies der Weg ist , typsicher , dies zu tun, die auch schützt vor Buggy - for inImplementierungen.

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

Welche kann sicher POLYfill verwendet werden. Beispiel

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

Leider kann es nicht Ihre Symbole aufgrund einer typecheck Einschränkung in der aktuellen TS , und es wird bei Ihnen nicht schreien , wenn die Zeichenfolge keine Definition überein aus irgendeinem Grund, ich werde den Fehler melden , nachdem er , ob sie sind bereits bewusst.

Beantwortet am 26/03/2019 um 02:25
quelle vom benutzer

stimmen
0

Ich füge dieses abraten Prototypen wie das Beispiel Zugabe in Frage gezeigt, da viele Menschen diese Frage sehen. Fügen Sie es wie folgt:

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

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

Der Grund dafür ist , wenn Sie es mit dem Prototyp direkt hinzufügen, könnte es , wenn eine Instanz , dass die Funktion get über aufgezählt aufgezählt bekommen. for i in ... Nun könnte dieser Block in einem Code sind Sie nicht (vor kurzem mir passiert) steuern, so ist es am besten , den Code so sicher wie möglich zu halten.

Beantwortet am 02/05/2017 um 22:52
quelle vom benutzer

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