TypeScript中抽象类的抽象构造函数



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

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

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

没有办法强制派生类型重写构造函数,但由于基构造函数是继承的,所以它似乎足够好了。

游乐场链接

创建FooImplnew实例会生成错误(因为构造函数是继承的,所以没有向构造函数传递任何args(,从而强制使用带args的构造函数:

const f = new FooImpl();
Expected 1 arguments, but got 0.

最新更新