2015-04-16 112 views
3

TypeScript中有一種方法來以通用的方式從靜態方法創建新的實例嗎?TypeScript從靜態上下文中的類創建新的實例

我想要做的事,如:

class Base { 
    static getInstance() { 
     return new self(); // i need this line :) 
    } 
} 

class Test extends Base { 
} 

class NextTest extends Base { 
} 

var test = Test.getInstance(); 
assert(test instanceof Test).toBe(true); 

var nextTest = NextTest.getInstance(); 
assert(nextTest instanceof NextTest).toBe(true); 

如果有人之前做這樣的事情這將是非常有益的,能幫助我。也許有一種JavaScript方式?

在此先感謝。

+0

我很好奇...爲什麼這會有用? –

+0

我打算用集成的RESTful客戶端構建TypeScript模型。因此,您可以導入TestModel並調用需要返回TestModel的TestModel.objects.all():D不知何故對象類(實際上是REST客戶端)需要知道要填充哪個模型。 – inferno

回答

6

哈克:)

static getInstance() { 
    return new this; 
} 
+2

不是黑客 - 按設計工作;) –

+0

感謝您這..我總是嘗試我的方法與靜態屬性不與方法:D類似於:「靜態道具:經理=新經理(新本);」 - 哪一個不是編譯:)我會用靜態方法 – inferno

-2

您還可以使用類名稱本身,這在你的例子是基地

static getInstance() { 
    return new Base() 
} 

另一個例子是低於它採用迎賓類名內靜態函數稱爲createInstance,您可以在TypeScript Playground

class Greeter { 
    greeting: string; 
    constructor(message: string) { 
     this.greeting = message; 
    } 
    greet() { 
     return "Hello, " + this.greeting; 
    } 

    static createInstance(message: any) { 
     return new Greeter(message); 
    } 
} 

let greeter = Greeter.createInstance("world"); 

let button = document.createElement('button'); 
button.textContent = "Say Hello"; 
button.onclick = function() { 
    alert(greeter.greet()); 
} 

document.body.appendChild(button); 

希望它有幫助。

+0

這是2年前正確回答的。根據問題,您的答案不會返回子類。 – mrm

+0

感謝您的更新@mrm。沒有注意到上面的子類需求。我只是嘗試了不同的代碼,並找到了一個Base類而不是'this'的例子,只是想詳細說明如何使用classname而不是這個,如果子分類需求不存在,也可以使用,儘管還沒有測試過但我會相信你說的話,因爲你已經測試過了。感謝您指出,幫助其他用戶。 –

相關問題