Typescript generisk abstrakt klasse - Hvorfor arver denne abstrakte metode ikke klassetypen?
Jeg kommer fra en baggrund i C#, og jeg prøver i øjeblikket at forstå Typescript. Jeg er stødt på følgende problem, mens jeg oprettede en generisk abstrakt klasse i Typescript, og jeg er ikke sikker på, om det er et problem med min implementering, eller en begrænsning i sproget:
Givet den følgende abstrakte klasse, og en klasse der udvider den:
abstract class Filter<T> {
value T;
abstract apply<T>(items: T[]): T[];
}
class StringFilter extends Filter<string> {
apply(items: string[]) {
return items.filter(i => this.value === i);
}
}
Jeg får følgende fejl:
Property 'apply' in type 'StringFilter' is not assignable to the same property in base type 'Filter<string>'.
Type '(items: string[]) => string[]' is not assignable to type '<T>(items: T[]) => T[]'.
I C# ville jeg have forventet, at apply-metoden deler den samme generiske type som klassen, men i Typescript ser det ikke ud til at være tilfældet.
Hvordan kan jeg sikre, at en type Filter<string> har en apply-metode af typen (items: string[]) => string[]?
Svar #1
Du behøver ikke at angive den generiske parameter til apply. Den følgende ændring af din kode kompilere uden problemer.
abstract class Filter<T> {
value: T;
abstract apply(items: T[]): T[];
}
class StringFilter extends Filter<string> {
apply(items: string[]) {
return items.filter(i => this.value === i);
}
}
Svar #2
Du skal fjerne <T> fra den abstrakte apply-metode.
Hvordan kan jeg sikre, at en type Filter har en apply-metode af typen (items: string[]) => string[]?
Nå, det gør du allerede. Definitionen af den abstrakte metode "apply" sikrer allerede din anmodning. Ved at sætte den abstrakte klasse som generisk, vil alle de metoder/egenskaber, der er defineret, arve T-specifikationen i den konkrete klasse.
