Abstrakt konstruktor på abstrakt klass i TypeScript
Hur kan jag skapa en abstrakt konstruktor för en abstrakt klass?
Till exempel, om jag har denna abstrakta klass:
export abstract class Foo<T> extends Bar<T> {
constructor(someParam: any) {
super();
this.someObj = someParam;
}
}
Sedan konsumeras det av denna klass:
export class FooImpl extends Foo<SomeType> {
}
Om jag inte skriver över konstruktorn kommer standardkonstruktorn utan parametrar att användas på FooImpl-klassen, vilket kommer att leda till ett felaktigt tillstånd inom klassen.
Hur kan jag definiera en abstrakt konstruktor eller tvinga konsumenter av den abstrakta klassen att åsidosätta konstruktorn när Foo<T> används?
REDIGERA
Den exakta koden jag har är nedan och det verkar som att detta på något sätt är relaterat till vscode
export abstract class FireStoreDataSource<T> extends DataSource<T> {
constructor(store: () => Observable<T[]>) {
super();
}
}
Då utökar jag denna klass på följande sätt
export class AssessmentCenterDataSource extends FireStoreDataSource<AssessmentCenter> {
}
Sedan skapa en instans i en Angular-komponent ngOnInit
ngOnInit() {
this.dataSource = new AssessmentCenterDataSource(() => this.service.getData());
}
Här i VSCode får jag kompileringsfelet [ts] Förväntade 0 argument, men fick 1., men när jag kör ng build byggs det korrekt
Om jag inte skickar något till konstruktorn försvinner kompileringsfelet och jag får ett fel när jag kör ng build vilket är error TS2554: Expected 1 arguments, but got 0.
Så det verkar som att detta kan vara ett problem med vscode eller någon av de tillägg jag har installerat snarare än TypeScript
Jag använder vscode insiders 1.26.0 och typescript insiders 3.0.1 tillsammans med Angular 6
Svar #1
Faktiskt, i Typescript, om du inte överskrider konstruktorn, är konstruktorn ärvd från basklassen.
Så i ditt fall skulle detta vara ogiltigt:
new FooImpl(); // error
Du skulle tvingas att skicka de parametrar som krävs av basklassen:
new FooImpl("") //ok
Det finns inget sätt att tvinga den härledda typen att åsidosätta konstruktorn, men eftersom baskonstruktorn är ärvd verkar det vara tillräckligt.
Lekplatslänk
Svar #2
Att skapa en new instans av FooImpl genererar ett fel (när inga argument skickas till konstruktorn, eftersom konstruktorn ärvts) vilket tvingar användningen av konstruktorn med argument:
const f = new FooImpl();
Expected 1 arguments, but got 0.
