Å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.
