Is er een manier om methoden toe te voegen on the fly om een ​​klas met behulp van typoscript?

stemmen
17

Ik probeer te maken een soort van mixin methode die methoden toe te voegen aan het prototype / klasse tijdens de vlucht, maar ik krijg fouten zoals

Het pand 'greetName' bestaat niet op de waarde van het type 'Greeter' elke

en

Het pand 'greetName' bestaat niet op de waarde van het type 'Greeter' elke

wanneer ik de volgende code.

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

Het compileert eigenlijk geldig js en uitgevoerd zoals verwacht. Is er een manier om dit te doen met uit compiler waarschuwingen / fouten?

De vraag is gesteld op 02/10/2012 om 22:49
bron van user
In andere talen...                            


6 antwoorden

stemmen
15

Deze oplossing heeft het voordeel van het geven u typt controleren wanneer u dynamisch een methode toe te voegen:

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();
antwoordde op 06/06/2013 om 17:02
bron van user

stemmen
8

Er is een andere manier om dit te doen.

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

Werkt hetzelfde en wordt de eigenschap indexer functie in javascript en typoscript niet klagen.

antwoordde op 19/12/2012 om 16:06
bron van user

stemmen
8

Ze zouden een concept van gedeeltelijke klassen voor dit te laten werken die op dit moment niet wordt ondersteund nodig. Ik zal je vertellen dat wat ik heb gevonden beter voor dit soort scenario's werkt is om interfaces te gebruiken in plaats (ik heb het programmeren van de schrijfmachine voor ongeveer 6 maanden nu - ik ben op MS, maar niet op het typoscript team)

Interfaces zijn uitbreidbaar na de feiten door simpelweg de methoden die u toevoegt aan de interface definging. Als voorbeeld van dit, als je een jQuery plugin installeren, wilt u opnieuw te definiëren de IJQuery & IJQueryUtil interface naar de plugins zijn onder andere methoden. Vanaf dat punt naar voren kunt u beroep doen op de plugins methoden door middel van $ .plugin () en typoscript zal blij zijn.

antwoordde op 02/10/2012 om 23:22
bron van user

stemmen
1

Net als bij voorbeeld @Fenton, maar zonder de gnarly stuff:

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

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
antwoordde op 26/05/2018 om 14:16
bron van user

stemmen
0

Dit is hoe RxJShet doet

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

}

Dit heet Module Augmentation.

antwoordde op 23/10/2018 om 00:21
bron van user

stemmen
0

Na dynamische methoden en eigenschappen uit te voeren op klassen, was dit de oplossing die ik was in staat om te gaan met om te voorkomen dat Typescript compiler te klagen:

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

In principe gebruikt de beugel werkwijze eigenschap accessors .

antwoordde op 26/08/2016 om 01:56
bron van user

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