Jak se prototyp rozšířit na psacím stroji?

hlasů
15

i rozšířena funkce prototypu, ale typescript nerozpozná.

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

Výsledek: TSC -e

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

Jak mohu rozšířit tento objekt?

Položena 07/10/2012 v 05:27
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
33

K dispozici je funkce rozhraní ve standardním strojopisu lib, který prohlašuje členy objektů funkce. Budete muset deklarovat proc jako člen tohoto rozhraní s vlastní add-on jako následující:

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

Toto rozhraní bude muset být uvedeno odkudkoliv chcete použít ‚proc‘.

Odpovězeno 07/10/2012 v 19:03
zdroj uživatelem

hlasů
6

Takhle:

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

Bez ‚deklarovat globální‘ to nefunguje.

Takhle augmentace modul pracuje v posledních verzích stroji. Podívejte se na dokumentaci a přejděte do Module augmentationsekce.

Odpovězeno 25/06/2016 v 05:00
zdroj uživatelem

hlasů
0

Jen s tím, že pokud se snažíte přidat definovat něco, co již deklarovanou, pak je to typesafe způsob, jak dělat tak, že také chrání před buggy for inimplementacemi.

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

Které mohou být použity k bezpečnému polyfill. Příklad

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

Bohužel to nelze typecheck své symboly kvůli omezením v běžných TS , a to nebude křičet na vás, pokud řetězec neodpovídá žádnou definici z nějakého důvodu, budu hlásit chybu poté, co viděl, jestli už jsou vědomi.

Odpovězeno 26/03/2019 v 02:25
zdroj uživatelem

hlasů
0

Já přidávám to nedoporučují přidání prototypy jako příkladu zobrazeném na otázku, protože mnoho lidí se dívá na tuto otázku. Přidejte ji takto:

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

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

Důvodem je, pokud si jej přidat do prototypu přímo, mohla by dostat výčtu, pokud instance výčtu, že funkce get je u konce. for i in .., Právě tento blok by mohl být v kódu nemusíte ovládat (v poslední době se mi stalo), tak to je nejlepší, aby svůj kód tak bezpečné, jak je to možné.

Odpovězeno 02/05/2017 v 22:52
zdroj uživatelem

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