Existuje způsob, jak přidat metody za běhu do třídy pomocí strojopis?

hlasů
17

Snažím se vytvořit jakousi mixin metoda, která přidat metody prototypu / třídě v reálném čase, ale jsem si chyby, jako je například

Vlastnost ‚greetName‘ neexistuje na hodnotě typu ‚Greeter‘ jakýkoli

a

Vlastnost ‚greetName‘ neexistuje na hodnotě typu ‚Greeter‘ jakýkoli

když jsem běžet následující kód.

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return Hello,  + this.greeting;
    }
}

Greeter.prototype.greetName = function(name){
        return this.greet() + ' ' + name;
}

var greeter = new Greeter('Mr');

window.alert(greeter.greetName('Name'));

Ve skutečnosti sestavuje platných JS a běží podle očekávání. Existuje způsob, jak toho dosáhnout s ven varování kompilátoru / chyby?

Položena 02/10/2012 v 22:49
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
15

Toto řešení má tu výhodu, dává vám kontrolu typu při dynamicky přidat metodu:

class MyClass {
    start() {

    }
}
var example = new MyClass();
// example.stop(); not allowed


interface MyClass {
  stop(): void;
}

MyClass.prototype['stop'] = function () {
    alert('Stop');
}
var stage2 = example;
stage2.stop();
Odpovězeno 06/06/2013 v 17:02
zdroj uživatelem

hlasů
8

Existuje jiný způsob, jak to udělat.

Greeter["SomeProperty"] = function() {
     return "somevalue";
};

Funguje stejně a používá funkci nemovitost indexovací v JavaScriptu a strojopis nestěžuje.

Odpovězeno 19/12/2012 v 16:06
zdroj uživatelem

hlasů
8

Budou potřebovat pojetí částečných tříd pro tuto práci, která v současné době není podporován. Řeknu vám, že to, co jsem našel funguje lépe pro tyto typy scénářů je využití rozhraní namísto (Byl jsem programování na stroji po dobu asi 6 měsíců - Jsem na MS, ale ne na psacím stroji týmu)

Rozhraní jsou rozšiřitelné po faktu jednoduše definging metod přidáváte do rozhraní. Jako příklad toho, pokud nainstalujete jQuery plugin budete chtít znovu definovat rozhraní IJQuery & IJQueryUtil zahrnout pluginů další metody. Od té chvíle vpřed můžete uplatnit pluginy metody přes $ .plugin () a psacím stroji budou spokojeni.

Odpovězeno 02/10/2012 v 23:22
zdroj uživatelem

hlasů
1

Podobně jako u @Fenton příklad, ale bez drsný věci:

class MyClass {
    start() {
    }
}
MyClass.prototype['stop'] = function () {
    alert('Stop');
}

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Odpovězeno 26/05/2018 v 14:16
zdroj uživatelem

hlasů
0

To je, jak RxJSto dělá

import {Observable} from "./observable"; // which is Greeter in your case 


declare module "./observable" {
    interface Observable<T> {
        map<U>(f: (x: T) => U): Observable<U>;
    }
}

Observable.prototype.map = function (f) {

}

Tento jev se nazývá modul prsou.

Odpovězeno 23/10/2018 v 00:21
zdroj uživatelem

hlasů
0

Po implementovat dynamické metody a vlastnosti na třídách, to bylo řešení, které jsem byl schopen jít s, aby se zabránilo strojopisem kompilátor od stěžovat:

...
window.alert(greeter['greetName']('Name'));

V zásadě použít metodu konzoly z přístupové objekty vlastnosti .

Odpovězeno 26/08/2016 v 01:56
zdroj uživatelem

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