class Singleton{ static getInstance<T extends {}>(this: new () => T): T { if(!(<any>this).instance){ (<any>this).instance = new this(); } return (<any>this).instance; } } class Bar extends Singleton { desc: string; public print(){ Log.log(this.desc); } } Bar.getInstance().desc = "single"; Bar.getInstance().print(); Bar.getInstance().print();