5

クラスの拡張メソッドを作成しようとしていますが、何か問題があるようです。以下はコードです。出力された JS ファイルは正しいですが、コンパイラは"test.ts(10,16): The property 'close' does not exist on value of type 'Test'" というエラーを 2 回表示します。 ?

class Test {
} 

interface Test
{
    close():any;
}

Test.prototype.close  = function() {}

var t = new Test();

t.close();

更新: 上記のコードは、組み込み型で問題なくコンパイルされます。自分のクラスを拡張する必要があります。

更新 2 : 古いコンパイラ バージョンの問題。今のところ大丈夫です!

4

1 に答える 1

5

この例では、継承を使用して元のオブジェクトを拡張します。ネーミングは説明用です。

class Test {
    baseMethod() {

    }
} 

class TestWithClose extends Test {
    close() {

    }
}

var t = new TestWithClose();

t.close();
t.baseMethod();

アップデート

コメントで、組み込み関数の拡張メソッドを好きなように記述できると述べましたが、独自のコードでも同じことをしたいことがわかりますが、それは不可能です。

これで理由が説明されることを願っています。

TypeScript で宣言を作成する場合、その宣言に追加することでその宣言を拡張できます。declare キーワードを使用するか、ファイルをファイルに配置.d.tsできます。

たとえば、1 つのファイルに次の宣言があるとします。

declare interface ExampleInterface {
    methodOne();
}

別のファイルで宣言を拡張できます。

declare interface ExampleInterface {
    methodTwo();
}

したがって、それを使用すると、両方の機能が利用可能になります。

function example(example: ExampleInterface) {
    example.methodOne();
    example.methodTwo();
}

これらは実際には拡張メソッドではありません。これは、複数回の実装についてコンパイラに伝えているだけです。これは、各プラグインがインターフェイスに追加する定義を持つことができるため、jQuery で特に役立ちJQueryます。

インターフェイスに追加すると、すべての実装でインターフェイス定義と一致するように更新が必要になるため、独自の TypeScript コードに対してこれを行うことはできません。

ここでのマインド シフトは、TypeScript が静的な型付けを提供し、動的な動作を探しているということです。そのため、どちらかを選択する必要があります。たとえば、本当に必要な場所で動的な動作を使用し、残りは静的に型付けしたままにすることができます。

class Test {
} 

// statically typed

var stTest = new Test();

// dynamically typed

var testExtender: any = Test;
testExtender.prototype.close = function() {
    alert('Close');
};

var t: any = new Test();
t.close();

拡張メソッドをサポートするために、将来的に何かが言語に追加されないと言っているわけではありません。

于 2012-11-05T10:15:13.500 に答える