2016-09-11 56 views
1

如果B扩展A,那么A是否可以定义一个创建新B的方法?如何在打字稿中的基类中创建相同类型的实例

class SetA { 
    constructor(public items:any[]) { 
    } 
    createNew(items){ 
     return new *typeof this*(items); //<-- insert actually working magic here 
    } 
    clone(){ 
     return this.createNew(this.items); 
    } 
} 
class SetB extends SetA { } 

var x = new SetB([1,2,3]); 
x.clone(); //<-- returns a new SetB 

回答

4

在这里你去:

type SetConstructor<T extends SetA> = { 
    new (items:any[]): T; 
} 

class SetA { 
    constructor(public items:any[]) {} 

    createNew(items): this { 
     return new (this.constructor as SetConstructor<this>)(items); 
    } 

    clone(){ 
     return this.createNew(this.items); 
    } 
} 

code in playground

createNew方法的返回类型是this这是Polymorphic this types

+0

完美,谢谢 – Flion

相关问题