2016-08-01 29 views
0

1)在TypeScript中,我怎樣才能找到全球定義的所有類?
2)如何通過超類來過濾它們?TypeScript/JavaScript:如何掃描所有全局類(並按超類過濾)?

我有模型類,其範圍擴展爲FrameModel。 這些在運行時不可知(可插拔)。
所以我想獲得FrameModel的子類列表。

這是我的嘗試:

public static scan() 
{ 
    this.mapping = {}; 
    for (var i = 0; i < props.length; i++) { 
     var key = props[i]; 
     var val = window[key]; 
     console.log(`Key: ${key} Val: ${val} ${typeof val}`); 
     if (val == null) 
      continue; 
     if (typeof val !== 'function') 
      continue; 
     if (val.prototype == void 0) 
      continue; 
     if (val.prototype.constructor !== FrameModel) 
      continue; 
     this.mapping[key] == val; // Doesn't work 
    } 
} 

我考慮的問題是:

  1. 採用window - 比方說,它不會在瀏覽器中運行。然後我需要一個全局對象。我已經看到在某些情況下使用this,IIRC在一個被稱爲對象之外的函數中獲取全局對象。這是「官方」的方式嗎?

  2. window[key]不起作用 - Window是不能分配給TYPEOF FrameModel

  3. 它掃描的所有Window道具,不只是Functions。我認爲有一些更明智的方法可以獲得Function的列表。

TypeScript 1.8。 Playground

+0

你不能做到這一點,如果我在一個封閉定義我的課? –

+0

好的,改變了 - 我只關心在全球範圍內定義的類。我在打字稿中沒有看到在閉包中定義的類,這是怎麼樣的? –

+0

明白了:https:// github。com /微軟/打字稿/拉/ 3266 –

回答

0

這些在運行時(插件)之前是未知的。

魔法自省對JavaScript不起作用。您通常需要一些依賴性框架(例如顯式代碼即裝飾器驅動的依賴框架)

我建議查看https://github.com/inversify/InversifyJS作爲選擇的DI框架。

更多

只是爲了你的好奇心:

使用窗口 - 比方說,它不會在瀏覽器中運行。然後,我需要在一般

一個全局對象,如果您使用global的WebPack將例如捆綁時,它會自動指向windowconsole.log(global); // Window。 Ofcourse在它的NodeJS將是全球:https://nodejs.org/api/globals.html#globals_global

設置的WebPack爲打字稿:https://basarat.gitbooks.io/typescript/content/docs/quick/browser.html