我正在尝试遍历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
),因此不能从这种孤独的方法中获得易于访问的构造函数。
在我的特定实例中,我有一个基类型数组,其中有许多类继承它们的定义。所以后来我需要从中提取特定类型。如果这不可能,我可能需要按类型开始存储。
有什么想法吗?感谢。
答案 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项目。这是一项正在进行的工作,但有些可用。