29

その場でプロトタイプ/クラスにメソッドを追加するある種の mixin メソッドを作成しようとしていますが、次のようなエラーが発生します

プロパティ「greetName」は、タイプ「Greeter」の値に存在しません

プロパティ「greetName」は、タイプ「Greeter」の値に存在しません

次のコードを実行すると。

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

実際に有効な js にコンパイルされ、期待どおりに実行されます。コンパイラの警告/エラーなしでこれを行う方法はありますか?

4

6 に答える 6

9

これを行う別の方法があります。

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

同じように動作し、javascriptのプロパティインデクサー関数を使用し、typescriptは文句を言いません。

于 2012-12-19T15:06:05.360 に答える
8

これが機能するには、現在サポートされていない部分クラスの概念が必要になります。これらのタイプのシナリオでうまく機能することがわかったのは、代わりにインターフェイスを使用することです(TypeScriptでプログラミングを始めてから約6か月です。MSにいますが、TypeScriptチームには参加していません)。

インターフェイスは、インターフェイスに追加するメソッドを定義するだけで、事後に拡張できます。この例として、jQueryプラグインをインストールする場合は、IJQueryおよびIJQueryUtilインターフェースを再定義して、プラグインに追加のメソッドを含める必要があります。その時点から、$。plugin()を介してプラグインメソッドを呼び出すことができ、TypeScriptは満足します。

于 2012-10-02T22:22:11.947 に答える
2

これはどのようRxJSにそれを行います

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

}

これをモジュール拡張と呼びます。

于 2018-10-23T00:21:30.917 に答える
0

After having to implement dynamic methods and properties on classes, this was the solution I was able to go with to prevent Typescript compiler from complaining:

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

Basically, use the bracket method of property accessors.

于 2016-08-26T01:56:18.133 に答える