Est-il possible d'ajouter des méthodes à la volée à une classe en utilisant tapuscrit?

voix
17

Je suis en train de créer une sorte de méthode mixin qui ajoutent des méthodes pour le prototype / classe à la volée mais je reçois des erreurs telles que

La propriété « greetName » n'existe pas sur la valeur de type « Greeter » une

et

La propriété « greetName » n'existe pas sur la valeur de type « Greeter » une

quand je lance le code suivant.

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

Il compile en fait js et essais valables comme prévu. Est-il possible de le faire avec des avertissements sur le compilateur / erreurs?

Créé 02/10/2012 à 22:49
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
15

Cette solution a l'avantage de donner vous Typage lorsque vous ajoutez dynamiquement une méthode:

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();
Créé 06/06/2013 à 17:02
source utilisateur

voix
8

Il y a une autre façon de le faire.

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

Fonctionne même et utilise la fonction indexeur de propriété en javascript et tapuscrit ne se plaint pas.

Créé 19/12/2012 à 16:06
source utilisateur

voix
8

Ils auraient besoin d'un concept de classes partielles pour ce travail qui est à l'heure actuelle pas pris en charge. Je vais vous dire que ce que j'ai trouvé fonctionne mieux pour ces types de scénarios est d'utiliser des interfaces à la place (je l'ai été la programmation dactylographiée depuis 6 mois maintenant - je suis à MS, mais pas sur l'équipe dactylographiée)

Les interfaces sont extensibles après le fait par definging simplement les méthodes que vous ajoutez à l'interface. À titre d'exemple, si vous installez un plugin jQuery vous voulez redéfinir pour inclure les plugins méthodes supplémentaires de l'interface IJQuery et IJQueryUtil. A partir de ce moment, vous pouvez appeler les méthodes de plugins par .plugin de $ () et tapuscrit sera heureux.

Créé 02/10/2012 à 23:22
source utilisateur

voix
1

Semblable à @Fenton exemple, mais sans les trucs noueux:

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

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Créé 26/05/2018 à 14:16
source utilisateur

voix
0

Voici comment RxJSil fait

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

}

Ceci est appelé module d'augmentation.

Créé 23/10/2018 à 00:21
source utilisateur

voix
0

Après avoir à mettre en œuvre des méthodes et des propriétés dynamiques sur les classes, ce fut la solution que j'ai pu aller avec le compilateur pour empêcher Tapuscrit de se plaindre:

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

Fondamentalement, utilisez la méthode de fixation des accesseurs de propriété .

Créé 26/08/2016 à 01:56
source utilisateur

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