Czy istnieje sposób, aby dodać metody w locie do klasy przy użyciu maszynopis?

głosy
17

Próbuję stworzyć jakąś metodę mixin że dodanie metod do prototypów / klasy w locie, ale pojawiają się błędy takie jak

Nieruchomość „greetName” nie istnieje na wartości typu „Greeter” wszelkie

i

Nieruchomość „greetName” nie istnieje na wartości typu „Greeter” wszelkie

kiedy uruchomić poniższy kod.

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

To faktycznie kompiluje się do ważnych js i tras, jak oczekiwano. Czy istnieje sposób to zrobić z out ostrzeżenia kompilatora / błędów?

Utwórz 02/10/2012 o 22:49
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
15

To rozwiązanie ma tę zaletę, dając wpisać sprawdzanie kiedy dynamicznie dodać 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();
Odpowiedział 06/06/2013 o 17:02
źródło użytkownik

głosy
8

Nie ma innego sposobu, aby to zrobić.

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

Działa tak samo i używa funkcji własność indeksatora w javascript i maszynopis nie narzeka.

Odpowiedział 19/12/2012 o 16:06
źródło użytkownik

głosy
8

Oni potrzebują pojęcia częściowego klas dla tej pracy, które obecnie nie są obsługiwane. Powiem ci, że to, co znalazłem działa lepiej dla tych typów scenariuszy jest zamiast używać interfejsów (I już zostały programowania w maszynopisie przez około 6 miesięcy - jestem na SM, ale nie w zespole maszynopis)

Interfejsy są rozsuwane po fakcie, po prostu definging metody jesteś dodając do interfejsu. Jako przykład tego, po zainstalowaniu wtyczki jQuery będziesz chciał ponownie zdefiniować interfejs IJQuery & IJQueryUtil zawierać wtyczek dodatkowych metod. Od tego momentu można wywołać metody wtyczek do $ .plugin () i maszynopis będzie zadowolony.

Odpowiedział 02/10/2012 o 23:22
źródło użytkownik

głosy
1

Podobny do @Fenton przykład, ale bez gnarly rzeczy:

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

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Odpowiedział 26/05/2018 o 14:16
źródło użytkownik

głosy
0

To jak RxJSto robi

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

}

Jest to tak zwany moduł Powiększanie.

Odpowiedział 23/10/2018 o 00:21
źródło użytkownik

głosy
0

Po wdrożenie metod i właściwości dynamicznych na zajęciach, było to rozwiązanie byłem w stanie przejść z kompilatora, aby zapobiec maszynopis z sędzią:

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

Zasadniczo, należy użyć metody wspornik udostępniające właściwości .

Odpowiedział 26/08/2016 o 01:56
źródło użytkownik

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