TypeScript中抽象类的抽象构造方法

时间:2018-07-18 10:06:20

标签: typescript abstract-class

如何为抽象类创建抽象构造函数?

例如,如果我有这个抽象类:

export abstract class Foo<T> extends Bar<T> {
  constructor(someParam: any) {
    super();
    this.someObj = someParam;
  }
}

然后由此类消耗:

export class FooImpl extends Foo<SomeType> {
}

如果我不重写该构造函数,则将在FooImpl类上使用默认的无参数构造函数,这将导致该类内的状态不正确。

在消耗Foo<T>时,如何定义抽象构造函数或强制抽象类的使用者覆盖该构造函数?

编辑

下面是我的确切代码,看来这与vscode相关

export abstract class FireStoreDataSource<T> extends DataSource<T> {
  constructor(store: () => Observable<T[]>) {
    super();
  }
}

然后我将按如下所示扩展该类

export class AssessmentCenterDataSource extends FireStoreDataSource<AssessmentCenter> {
}

然后在角度组件ngOnInit中创建实例

ngOnInit() {
  this.dataSource = new AssessmentCenterDataSource(() => this.service.getData());
}

在vscode中,我遇到编译器错误[ts] Expected 0 arguments, but got 1.,但是当我运行ng build时,它确实可以正确构建

如果我没有将任何内容传递给构造函数,那么编译器错误就会消失,并且在运行ng build的{​​{1}}时会收到错误消息

所以看来这可能是vscode或我安装的插件之一而不是打字稿的问题

我正在使用vscode内部人员1.26.0和打字稿内部人员3.0.1以及Angular 6

2 个答案:

答案 0 :(得分:3)

实际上,在Typescript中,如果您不重写构造函数,则构造函数将从基类继承。

因此,在您的情况下,这将是无效的:

new FooImpl(); // error 

您将被迫传递基类所需的参数:

new FooImpl("") //ok

没有办法强制派生类型重写构造函数,但是由于继承了基本构造函数,这似乎已经足够了。

Playground link

答案 1 :(得分:0)

创建new的{​​{1}}实例会产生错误(当不向构造函数传递args时,因为构造函数是继承的),从而强制使用带有args的构造函数:

FooImpl