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.

Relaterede artikler