2015-04-16 74 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而不是这个,如果子分类需求不存在,也可以使用,尽管还没有测试过但我会相信你说的话,因为你已经测试过了。感谢您指出,帮助其他用户。 –

相关问题