Există o modalitate de a adăuga metode pe zbor la o clasă folosind dactilografiate?

voturi
17

Încerc a crea un fel de metode mixin care se adaugă metode la prototip / clasa pe zbor, dar am obține erori, cum ar fi

Proprietatea „greetName“ nu exista pe valoarea de tip „Greeter“ orice

și

Proprietatea „greetName“ nu exista pe valoarea de tip „Greeter“ orice

când am rulat următorul cod.

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

Este de fapt, compilează și rulează la js valide cum era de așteptat. Există o modalitate de a face acest lucru cu avertismente compilator / erori?

Întrebat 02/10/2012 la 22:49
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
15

Această soluție are avantajul de a oferindu-vă tip de verificare, atunci când adăugați dinamic o metodă:

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();
Publicat 06/06/2013 la 17:02
sursa de către utilizator

voturi
8

Există un alt mod de a face acest lucru.

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

Funcționează la fel și utilizează funcția indexor de proprietate în JavaScript și dactilografiat nu se plânge.

Publicat 19/12/2012 la 16:06
sursa de către utilizator

voturi
8

Ei ar avea nevoie de un concept de clase parțiale pentru ca aceasta să funcționeze, care în prezent nu este acceptată. O să-ți spun că ceea ce am găsit funcționează mai bine pentru aceste tipuri de scenarii este de a folosi interfețe în loc (am programare dactilografiat timp de aproximativ 6 luni - Sunt la SM, dar nu pe echipa typescript)

Interfețele sunt extensibile după fapt prin simpla definging metodele pe care le adăugați la interfața. Ca un exemplu în acest sens, dacă instalați un plugin jQuery veți dori să re-defini interfața IJQuery & IJQueryUtil pentru a include plugin-urile metode suplimentare. Din acel moment vă puteți invoca metodele prin plugins $ .plugin () și typescript va fi fericit.

Publicat 02/10/2012 la 23:22
sursa de către utilizator

voturi
1

Similar cu @Fenton exemplu, dar fără chestii noduros:

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

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Publicat 26/05/2018 la 14:16
sursa de către utilizator

voturi
0

Acesta este modul în care RxJSo face

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

}

Aceasta se numește modulul augmentare.

Publicat 23/10/2018 la 00:21
sursa de către utilizator

voturi
0

După ce să pună în aplicare metode dinamice și proprietăți pe clase, aceasta a fost soluția am fost în stare să meargă cu compilator pentru a preveni typescript de dur:

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

Practic, utilizați metoda suport de Conturi cu acces de proprietate .

Publicat 26/08/2016 la 01:56
sursa de către utilizator

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