基于ClassName创建类的实例:string

时间:2016-07-01 05:43:37

标签: typescript angular typescript1.8

在任何人将此标记为重复之前,请阅读以下内容,

我的场景不仅涉及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

2 个答案:

答案 0 :(得分:11)

对{/ p>等导入使用as

import * as widgets from './lib';
...
this.widgetInstance = new widgets[className](); 

Plunker example

我从另一个答案中记得这个,但是我无法找到它给予一些信任: - /

答案 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