I have an abstract class Router:
export abstract class Router {
}
And an interface like this
interface IModule {
name: string;
forms: Array<IForm>,
route: typeof Router
}
Now I have a class which looks like this, and many others based on Router abstract
export class Module1 extends Router {
}
Now, I want to instantiate the route like this:
let module: IModule = {
name: "My Module",
forms: [],
route: Module1
}
let router = new module.route();
// TS2511: Cannot create an instance of an abstract class.
The code run just fine, and the instance of router = new Module1() is made properly, but I obviously doesn't write it properly in Typescript because I see TS2511: Cannot create an instance of an abstract class.
when transpiling.
What is the correct way to define this?
When you have an abstract class, it's constructor is only invokable from a derived class, since the class is abstract and should not be instantiated. This carries over when you type something as typeof AbstractClass
, the constructor will not be callable.
The solution would to be to not use typeof Router
but rather a constructor signature that returns a Router
interface IModule {
name: string;
forms: Array<IForm>,
route: new () => Router
}
Another solution if you need to access static methods of Router
is to create an interface derived from typeof Router
which will erase the abstractness of the constructor:
export abstract class Router {
static m(): void { console.log("Router"); }
}
type RouterClass = typeof Router;
interface RouterDerived extends RouterClass { }
interface IModule {
name: string;
route: RouterDerived
}
export class Module1 extends Router {
static m(): void { console.log("Module1"); }
}
let module: IModule = {
name: "My Module",
route: Module1
}
module.route.m();
let router = new module.route();