タイプスクリプトを使用してクラスにメソッドを追加する方法はありますか?

StackOverflow https://stackoverflow.com//questions/12698893

  •  12-12-2019
  •  | 
  •  

質問

その場でプロトタイプ/クラスにメソッドを追加するいくつかの種類の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にコンパイルし、期待どおりに実行されます。コンパイラの警告/エラーでこれを行う方法はありますか?

役に立ちましたか?

解決

このソリューションには、メソッドを動的に追加するときにチェックをすることの利点があります。

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();
.

他のヒント

現在はサポートされていない作業には、これに対して部分的なクラスの概念が必要です。これらの種類のシナリオのために私が見つけたことがわかったことをあなたに言うつもりです(私は今、約6ヶ月間のタイプスクリプトでプログラミングしています - 私はMSにいますが、TypeScriptチームではありません)

インターフェイスは、インターフェイスに追加するメソッドを単純に区切ることによって、事実の後に拡張可能です。この例として、jQueryプラグインをインストールした場合は、プラグインを追加のメソッドを含めるようにIjQuery&IjQueryUtilインターフェイスを再定義します。その時点から、$ .plugin()を介してプラグインメソッドを呼び出すことができ、TypeScriptは幸せになります。

これを行うもう1つの方法があります。

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

は、JavaScriptでプロパティインデクサー機能を使用していて、Scriptは文句を言っていません。

例の例と同様ですが、gnarly stuffのない:

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

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
.

これは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) {

}
.

これはモジュール増強と呼ばれます。

クラスに動的な方法やプロパティを実装し続けた後、これはTypeScriptコンパイラが不平を言うのを防ぐために私が行く解決策でした:

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

基本的には、プロパティアクセサーのブラケット法を使用してください。/ a>。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top