You can use this type of constructors: { new (): ClassType }
.
class MyManager<T> {
private cls: { new(): T };
constructor(cls: { new(): T }) {
this.cls = cls;
}
createInstance(): T {
return new this.cls();
}
}
class MyClass {}
let test = new MyManager(MyClass);
let a = test.createInstance();
console.log(a instanceof MyClass); // true
Edit
The proper way to describe a class type in typescript is using the following:
{ new(): Class }
For example in the typescript lib.d.ts ArrayConstructor
:
interface ArrayConstructor {
new (arrayLength?: number): any[];
new <T>(arrayLength: number): T[];
new <T>(...items: T[]): T[];
(arrayLength?: number): any[];
<T>(arrayLength: number): T[];
<T>(...items: T[]): T[];
isArray(arg: any): arg is Array<any>;
readonly prototype: Array<any>;
}
Here you have 3 different ctor signatures plus a bunch of static functions.
In your case you can also define it like:
interface ClassConstructor<T> {
new(): T;
}
class MyManager<T> {
private cls: ClassConstructor<T>;
constructor(cls: ClassConstructor<T>) {
this.cls = cls;
}
createInstance(): T {
return new this.cls();
}
}