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

2

TypeScript 类型在编译过程中无法生存——它们会被删除,因此您的所有模块和类在运行时都是对象。

这意味着您需要借助JavaScript 在运行时获取对象的名称(或在每个类上弹出一个属性来告诉您其类型)。

下面的示例直接取自文章,需要注意的是您只能获取本地名称 - 您不知道完整路径(例如 Module.Module.ClassName):

class Describer {
    static getName(inputClass) { 
        var funcNameRegex = /function (.{1,})\(/;
        var results = (funcNameRegex).exec((<any> inputClass).constructor.toString());
        return (results && results.length > 1) ? results[1] : "";
    }
}
class Example {
}
class AnotherClass extends Example {
}
var x = new Example();
var y = new AnotherClass();
alert(Describer.getName(x)); // Example
alert(Describer.getName(y)); // AnotherClass
于 2013-08-05T11:01:52.090 回答
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 回答