使用AMD加载在TypeScript中按类型获取对象

时间:2013-08-05 10:47:06

标签: typescript amd

我正在尝试遍历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),因此不能从这种孤独的方法中获得易于访问的构造函数。

在我的特定实例中,我有一个基类型数组,其中有许多类继承它们的定义。所以后来我需要从中提取特定类型。如果这不可能,我可能需要按类型开始存储。

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:2)

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

这意味着您需要诉诸JavaScript to get the name of the object at runtime(或在每个类上弹出一个告诉您其类型的属性)。

以下示例直接来自文章,并且需要注意的是您只获取本地名称 - 您不知道完整路径(例如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

答案 1 :(得分: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项目。这是一项正在进行的工作,但有些可用。