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

2024-01-08

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

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

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

然后它被这个类消耗:

export class FooImpl extends Foo<SomeType> {
}

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

如何定义抽象构造函数或强制抽象类的使用者在以下情况下重写构造函数:Foo<T>被消耗了?

EDIT

我的确切代码如下,看起来这与 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 或我安装的插件之一的问题,而不是打字稿的问题

我正在使用 vscode insiders 1.26.0 和 typescript insiders 3.0.1 以及 Angular 6


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

所以在你的情况下,这将是无效的:

new FooImpl(); // error 

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

new FooImpl("") //ok

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

游乐场链接 http://www.typescriptlang.org/play/#src=class%20Bar%3CT%3E%20%7B%0D%0A%0D%0A%7D%0D%0A%0D%0Aexport%20abstract%20class%20Foo%3CT%3E%20extends%20Bar%3CT%3E%20%7B%0D%0A%20%20%20%20someObj%3A%20any%0D%0A%20%20%20%20constructor(someParam%3A%20any)%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%3B%0D%0A%20%20%20%20%20%20%20%20this.someObj%20%3D%20someParam%3B%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0Aclass%20SomeType%20%7B%20%7D%0D%0Aexport%20class%20FooImpl%20extends%20Foo%3CSomeType%3E%20%7B%0D%0A%7D%0D%0A%0D%0Anew%20FooImpl()%20%2F%2F%20Error%0D%0Anew%20FooImpl(%22%22)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 中抽象类的抽象构造函数 的相关文章

随机推荐