如何为抽象类创建抽象构造函数?
例如,如果我有一个抽象类:
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
(即error TS2554: Expected 1 arguments, but got 0.
(时会出现错误
所以看起来这可能是vscode或我安装的某个插件的问题,而不是typescript 的问题
我正在使用vscode内部人士1.26.0和typescript内部人士3.0.1以及Angular 6
实际上,在Typescript中,如果不重写构造函数,则构造函数是从基类继承的。
因此,在您的情况下,这将是无效的:
new FooImpl(); // error
您将被迫传递基类所需的参数:
new FooImpl("") //ok
没有办法强制派生类型重写构造函数,但由于基构造函数是继承的,所以它似乎足够好了。
游乐场链接
创建FooImpl
的new
实例会生成错误(因为构造函数是继承的,所以没有向构造函数传递任何args(,从而强制使用带args的构造函数:
const f = new FooImpl();
Expected 1 arguments, but got 0.