0

arrayをループして、必要なアイテムを一般的に取得しようとしています。最初に私はこれをしました:

  getItemsByType<T>(type: string): T[] {
     var results: T[] = [];
     for (var item in this) {
        if (typeof this[item] === type) {
           results.push(this[item]);
        }
     }
     return results;
  }

ただし、私の Foo() クラスは typeof オブジェクトとして返されます。

  getItemsByType<T>(type: string): T[] {
     var results: T[] = [];
     for (var item in this) {
        if (this[item] instanceof type) {
           results.push(this[item]);
        }
     }
     return results;
  }

instanceofこれは機能しません。実際のがないと使用できませんclass。ただし、AMDローダー ( dojo) を使用しているため、この孤独なメソッドから簡単にアクセスできるコンストラクターを持たないことはできません。

私の特定のインスタンスでは、基本型の配列があり、多くのクラスが定義のためにそれを継承しています。そのため、後で特定のタイプをプルする必要があります。これが不可能な場合は、タイプ別に保存を開始する必要があるかもしれません。

何か案は?ありがとう。

4

2 に答える 2

0

次のようなものを試してください:

interface NewableClass { new(); }

getItemsByType<T extends NewableClass>(type: T): T[] {
     var results: T[] = [];
     for (var item in this) {
        if (this.hasOwnProperty(item) && this[item] instanceof type) {
           results.push(this[item]);
        }
     }
     return results;
}

typeこれは、それが「新しい」ものでなければならないことを指定します。たとえば、タイプとして dijit を使用する場合は、次のように使用します。xxx.getItemsByType(dijit.form.TextBox);

新しいインターフェイスを作成したくない場合は、次のこともできます。

getItemsByType<T extends Function>(type: T)

JavaScript では、クラスは実際には関数です。LINQ-to-TypeScriptプロジェクトには、このように定義されたメソッドがありますofType

また、Dojo を使用している場合は、私のDojo-TypeScriptプロジェクトをチェックしてください。これは進行中の作業ですが、ある程度使用できます。

于 2013-08-06T04:08:52.137 に答える