在任何人将此标记为重复之前,请阅读以下内容,
我的场景不仅涉及TypeScript,还涉及 Angular2。
目标
我在app.component.ts中需要一个方法,它接受一个字符串(Class Name)并创建一个实例。这些类存在于其他ts文件中。
现在用例:
我有一个方法getWidgetObjectFromClassName(className : string) : Object{}
,它需要返回字符串格式的类名实例。
现在问题,
我尝试使用NameSpace并执行let instance = new SampleNS['OtherName']();
(SampleNS是命名空间),在单个文件的情况下工作得很好。
但是现在
我有多个ts文件让我们说interfaces.ts,classes.ts,otherclasses.ts。我在interface.ts中使用export namespace SampleNS{}
一切正常,接下来在classes.ts中使用/// <reference path="interfaces.ts" />
和相同的命名空间SampleNS
。
现在我的方法getWidgetObjectFromClassName(className : string) : Object{}
在xyz.ts中,现在我应该给哪个导入?,我的观点是,如果我说'import {SampleNS}来自'./interfaces'。
这里的问题是我只能导入单个文件的命名空间(即使它是相同的)因此我创建实例仅限于导入该特定文件命名空间。
Plunker Link https://plnkr.co/edit/pt90F34KPsGoHDpSUQFD?p=preview
答案 0 :(得分:11)
对{/ p>等导入使用as
import * as widgets from './lib';
...
this.widgetInstance = new widgets[className]();
我从另一个答案中记得这个,但是我无法找到它给予一些信任: - /
答案 1 :(得分:3)
您可以使用eval从类名创建对象:
class SomeClass
{
x: number;
y: number;
constructor() {
this.x = this.y = 1;
}
}
function getWidgetObjectFromClassName(className : string) : {}
{
return eval("new " + className + "();");
}
console.log("%o", getWidgetObjectFromClassName("SomeClass"));
游乐场here