Åsidosätta en generisk metod i TypeScript


Jag försöker skapa en basklass AbstractQuery och ärva den med underklasser och sedan skriva över några av dess metoder.

class AbstractQuery {
    public before<A, S>(context: Context<A>, args: A, source?: S): Promise<A> {
        return Promise.resolve(args);
    }
}

Nu skulle jag vilja skriva över ovanstående AbstractQuery::before-metod i min subklass:

class FindBookByIdQuery extends AbstractQuery {
    public before(context: Context<arguments.ID>, args: arguments.ID): Promise<arguments.ID> {
        this.log.debug('hook before args', args);
        return Promise.resolve(args);
    }
}

Men jag får ett fel:

[ts] Egenskapen 'before' i typen 'FindBookByIdQuery' kan inte tilldelas samma egenskap i basklassen 'AbstractQuery'. Typen '(context: Context, args: ID) => Promise' kan inte tilldelas typen '(context: Context, args: A, source?: S) => Promise'. Typerna av parametrarna 'context' och 'context' är inkompatibla. Typen 'Context' kan inte tilldelas typen 'Context'. Typen 'A' kan inte tilldelas typen 'ID'. [2416]

Svar #1

TypeScript har rätt att påpeka felet. I AbstractQuery är kontexten som används av before-metoden bunden med dess typparameter. Men i FindBookByIdQuery finns ingen sådan relation.

Om du vill tillåta att before har variadiskt beteende, överbelasta dess definition. Överväg detta exempel:

declare abstract class Foo<T> {
    before<U>(context: U): Promise<U>;
    before(context: T): Promise<T>
}

declare class Bar<T> extends Foo<T> {
    before(context: T): Promise<T>
}

Här kan before vara generiskt (första överlagringen) eller bero på någon annan typ. I detta exempel är denna andra typ typparametern för själva klassen.

Relaterade artiklar