如何为抽象类创建抽象构造函数?
例如,如果我有这个抽象类:
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
答案 0 :(得分:3)
实际上,在Typescript中,如果您不重写构造函数,则构造函数将从基类继承。
因此,在您的情况下,这将是无效的:
new FooImpl(); // error
您将被迫传递基类所需的参数:
new FooImpl("") //ok
没有办法强制派生类型重写构造函数,但是由于继承了基本构造函数,这似乎已经足够了。
答案 1 :(得分:0)
创建new
的{{1}}实例会产生错误(当不向构造函数传递args时,因为构造函数是继承的),从而强制使用带有args的构造函数:
FooImpl