Er det en måte å legge til metoder på fly til en klasse ved hjelp av typescript?

stemmer
17

Jeg prøver å skape en slags mixin metode som legger metoder for å prototype / klasse på fly, men jeg får feil som

Eiendommen 'greetName' eksisterer ikke på verdien av type 'Greeter' enhver

og

Eiendommen 'greetName' eksisterer ikke på verdien av type 'Greeter' enhver

når jeg kjører følgende kode.

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

Det kompilerer faktisk å gyldige js og går som forventet. Er det en måte å gjøre dette med ut kompilatoren advarsler / feil?

Publisert på 02/10/2012 klokken 21:49
kilden bruker
På andre språk...                            


6 svar

stemmer
15

Denne løsningen har fordelen av å gi du skriver sjekker når du dynamisk legge til en metode:

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();
Svarte 06/06/2013 kl. 16:02
kilden bruker

stemmer
8

Det er en annen måte å gjøre dette.

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

Fungerer det samme og bruker eiendommen indekser funksjon i javascript og Loggfila ikke klage.

Svarte 19/12/2012 kl. 15:06
kilden bruker

stemmer
8

De ville trenge et konsept av partielle klasser for at dette skal fungere som foreløpig ikke er støttet. Jeg skal fortelle deg at det jeg har funnet fungerer bedre for disse typer scenarier er å bruke grensesnitt i stedet (jeg har vært programmering i Loggfila i ca 6 måneder nå - jeg er på MS, men ikke på Loggfila lag)

Grensesnitt er utvidbar i ettertid ved ganske enkelt definging metodene du legger til grensesnittet. Som et eksempel på dette, hvis du installerer en jQuery plugin du ønsker å redefinere IJQuery & IJQueryUtil grensesnitt for å inkludere plugins flere metoder. Fra dette tidspunktet kan du påkalle plugins metoder gjennom $ .plugin () og Loggfila vil bli lykkelig.

Svarte 02/10/2012 kl. 22:22
kilden bruker

stemmer
1

I likhet med @Fenton eksempel, men uten gnarly ting:

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

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Svarte 26/05/2018 kl. 14:16
kilden bruker

stemmer
0

Slik RxJSvirker det

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

}

Dette kalles Module styrking.

Svarte 23/10/2018 kl. 00:21
kilden bruker

stemmer
0

Etter å ha å implementere dynamiske metoder og egenskaper på klasser, dette var den løsningen jeg var i stand til å gå med å hindre Loggfila kompilatoren fra klag:

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

I utgangspunktet bruke braketten metode for eiendoms accessors .

Svarte 26/08/2016 kl. 01:56
kilden bruker

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