2013-08-05 51 views
0

我試圖循環訪問array並通用地獲取我想要的項目。起初,我這樣做:在TypeScript中使用AMD加載類型獲取對象

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; 
    } 

這是行不通的,沒有實際class我不能使用instanceof。但是我使用的是一個AMD加載器(dojo),所以不能從這個孤獨的方法中獲得一個容易訪問的構造函數。

在我的具體實例中,我有一個基類型的數組,其中有許多類爲它們的定義繼承它。所以後來我需要從中抽取特定類型。如果這是不可能的,我可能需要按類型開始存儲。

任何想法?謝謝。

回答

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 
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項目。這是一項正在進行的工作,但有些可行。

+0

另外,請注意您忘記的''hasOwnProperty''。將此調用與''for ... in''循環內部配對通常是一個好主意。 –

相關問題