2015-10-13 47 views
8

可以說我有一些財產dataItems一個基類,它是DataItem的數組:獲取變量的類型並創建該類型的新實例

export class BaseClass{ 
    dataItems:DataItems[]; 
} 

然後,我有幾類,其擴展BaseClass的和他們dataItems屬性是一些類延伸DataItems數組:

export class BetterClass extends BaseClass{ 
    dataItems:BetterDataItems[]; 
} 

export class BestClass extends BaseClass{ 
    dataItems:BestDataItems[]; 
} 

現在我想添加在BaseClass的一種方法,其創建dataItems並將它們添加到陣列。是否有可能在BaseClass中完成所有這些工作?我需要創建BetterDataItems或BestDataItems的實例,具體取決於所使用的類。

目前我簡單地添加:

dataItemType: typeof DataItem; 

屬性BaseClass的並且在每個延伸類的BaseClass我重寫與適當的數據項類型這個變量:

在BetterClass

dataItemType: typeof BetterDataItem = BetterDataItem; 

in BestClass:

dataItemType: typeof BestDataItem = BestDataItem; 

,然後在BaseClass的我這樣做:

var dataItem = new this.dataItemType(); 

這工作得很好,但我的問題是 - 這樣纔有可能避免具有所有dataItemType財產?我可以找到一種dataItems數組,然後創建一個新實例嗎?

謝謝!

回答

4

打字稿1.6代碼:

class DataItems { 

} 

class BaseClass { 
    dataItems:DataItems[]; 
    dataItemType: typeof DataItems = DataItems; 
} 

編譯爲:

var DataItems = (function() { 
    function DataItems() { 
    } 
    return DataItems; 
})(); 
var BaseClass = (function() { 
    function BaseClass() { 
     this.dataItemType = DataItems; 
    } 
    return BaseClass; 
})(); 

而且你可以看到dataItems屬性,類型信息丟失的BaseClass。這就是TypeScript編譯器的工作原理。 It does not support runtime checking。所以回答你的問題是不。


您與dataItemType: typeof BetterDataItem = BetterDataItem;作品的解決辦法,因爲你做的打字稿編譯器添加JS命令:this.dataItemType = BetterDataItem;以後它可以使用。

4

選擇1:你可以覆蓋的方法在每個子類...

export class BaseClass{ 
    dataItems:DataItem[]; 

    create() { 
     this.dataItems.push(new DataItem()); 
    } 
} 

export class BetterClass extends BaseClass{ 
    dataItems:BetterDataItem[]; 

    create() { 
     this.dataItems.push(new BetterDataItem()); 
    } 
} 

export class BestClass extends BaseClass{ 
    dataItems:BestDataItem[]; 

     create() { 
     this.dataItems.push(new BestDataItem()); 
    } 
} 

選項2:但是,如果你介紹一個通用基礎類,你可以刪除需要定義dataItems財產上的每個類並創建不同的實例。

type MyT = typeof DataItem; 

export class GenericBaseClass<T extends DataItem> { 
    dataItems:T[]; 

    constructor(private dataType: MyT) { 

    } 

    create() { 
     this.dataItems.push(<T>new this.dataType()) 
    } 

} 

export class BaseClass extends GenericBaseClass<DataItem> { 
    constructor() { 
     super(DataItem); 
    } 
} 

export class BetterClass extends GenericBaseClass<DataItem> { 
    constructor() { 
     super(BetterDataItem); 
    } 
} 

export class BestClass extends GenericBaseClass<DataItem> { 
    constructor() { 
     super(BestDataItem); 
    } 
} 
+1

+1;爲了完整起見,我認爲你可以在'BaseClass'中使用'instanceof'運算符,但在這種情況下它確實是一種反模式。 (http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf 4.13類型斷言) –

+0

謝謝。所以我認爲不可能簡單地從一個變量中獲得一個類的類型,然後創建一個類?instanceof需要檢查每種類型,所以它不是一個好的解決方案。 – zeroin

相關問題