2016-07-01 37 views
5

在任何人,標誌着這是一式兩份,請閱讀以下,創建例如,基於類名類數:字符串

我的情況並不僅僅涉及打字稿也Angular2。

目的

我需要在app.component.ts的方法,其採用一個字符串(類名稱),並創建的一個實例。這些類存在於其他的ts文件中。

我們用例: 我有一個方法getWidgetObjectFromClassName(className : string) : Object{}它需要返回的類名是字符串格式的實例。 現在的問題,

我試過使用NameSpace和做let instance = new SampleNS['OtherName']();(SampleNS是一個名稱空間),在單個文件的情況下工作得很好。

但現在 我有多個TS文件可以說interfaces.ts,classes.ts,otherclasses.ts。 Im在interface.ts中使用export namespace SampleNS{}全部工作,在classes.ts中使用/// <reference path="interfaces.ts" />和相同名稱空間SampleNS

現在我的方法getWidgetObjectFromClassName(className : string) : Object{}是在xyz.ts中,現在應該給我哪個導入?,我的觀點是如果我從`./interfaces'導入{SampleNS}。 這裏的問題是我只能導入單個文件的命名空間(即使它是相同的),因此即時創建實例僅限於導入該特定文件命名空間。

Plunker鏈接https://plnkr.co/edit/pt90F34KPsGoHDpSUQFD?p=preview

+0

有關創建導出所有的組件文件,那麼你只是需要導入該文件是什麼一個命名空間,然後你應該能夠以同樣的方式引用所有組件? –

+1

*「之前有人將此標記爲重複請在下面閱讀,」* - 不,我喜歡通過翻轉硬幣來判斷事物是否重複。 – nnnnnn

+0

ok gunter ...嘗試你的解決方案將回來... –

回答

6

使用as與像

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

Plunker example

我記得從另一個答案,但我找不到它給一些信用: -/

+0

一如既往,你真棒! –

1

您可以用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

+0

這工作得很好,但現在對於我的場景,當我有我的SomeClass其他ts文件,即使我導入它無法找到它。請檢查 –

+2

可能需要包含模塊或名稱空間:getWidgetObjectFromClassName(「ModuleOrNamespace。SomeClass「) –

+0

這不是一個乾淨的解決方案,但絕對有效,爲什麼downvote? – titusfx