好的。这非常简单,只需删除一条令人讨厌的错误消息即可。
我有一个抽象类Router:
interface IModule {
name: string;
forms: Array<IForm>,
route: typeof Router
}
还有这样的界面
export class Module1 extends Router {
}
现在我有一个像这样的类,还有许多其他基于Router抽象的
let module: IModule = {
name: "My Module",
forms: [],
route: Module1
}
let router = new module.route();
// TS2511: Cannot create an instance of an abstract class.
现在,我想像这样实例化路线:
TS2511: Cannot create an instance of an abstract class.
代码运行得很好,并且router = new Module1()的实例制作正确,但是我显然不能正确地在Typescript中编写它,因为在编译时我看到app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders =
ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();
。
定义此的正确方法是什么?
谢谢
答案 0 :(得分:8)
当您有一个抽象类时,它的构造函数只能从派生类中调用,因为该类是抽象的,不应实例化。当您键入诸如typeof AbstractClass
之类的内容时,这会继续进行,构造函数将不可调用。
解决方案是不使用typeof Router
而是返回一个Router
的构造函数签名
interface IModule {
name: string;
forms: Array<IForm>,
route: new () => Router
}
如果需要访问Router
的静态方法的另一种解决方案是创建一个从typeof Router
派生的接口,这将消除构造函数的抽象性:
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();
答案 1 :(得分:0)
注意,已接受答案的第二部分涵盖:
<块引用>如果你需要访问Router的静态方法...
提议的解决方案实际上不起作用。只是花了相当多的时间试图弄清楚这一点,所以尽管我补充说:这样做的方法是:
type RouterDerived = {new (): Router} & typeof Router;
完整示例 playground。