2016-09-10 79 views
1

我卡在:從基類靜態方法返回一個Child類的新實例

我想要一個可以返回其子類的新對象的基類。

,如:

export class Base { 
    constructor() { 
    } 

    static query() { 
     //return a new object of class from which this function is called. 
    } 

} 

export class Child extends Base { 

} 
現在

在我IndexComponent類

export class IndexComponent { 
var user = Child.query() // By this I have a new object of Child class in user variable 
} 

預先感謝您!

回答

2

的解決方案是簡單的:

export class Base { 
    constructor() {} 

    static query() { 
     return new this(); 
    } 
} 

let base = Base.query(); // Base {} 
let child = Child.query(); // Child {} 

code in playground

此操作,因爲執行靜態功能時,則this是構造函數。
你可以看到,在編譯的JS:

var Base = (function() { 
    function Base() { 
    } 
    Base.query = function() { 
     return new this(); 
    }; 
    return Base; 
}()); 

query功能Base構造函數的性質,因爲它擴展Base也將是Child的屬性。

這裏的問題是如何輸入這個query函數,以便編譯器知道什麼是返回的類型。
現在你需要做:

let base = Base.query(); // here base is of type 'Base' 
let child: Child = Child.query(); // need to declare the type 
// or 
let child2 = Child.query() as Child; // or assert it 

我不能想辦法讓編譯器推斷其返回正確的類型,很想知道如果任何人有一個想法。

+0

謝謝。我能夠控制子類的對象。 –

+0

謝謝你的回答。我有類似的情況,但我的基類是抽象的,編譯器給我這個錯誤:'錯誤TS2511:無法創建抽象類的實例...'。我該如何處理?如果我刪除'抽象'關鍵字它能正常工作。 –

+0

更多細節在這裏:https://github.com/Microsoft/TypeScript/issues/5863 –

相關問題