打字稿:抽象类的实例

时间:2018-09-16 20:33:47

标签: typescript

好的。这非常简单,只需删除一条令人讨厌的错误消息即可。

我有一个抽象类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();

定义此的正确方法是什么?

谢谢

2 个答案:

答案 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