TypeScript generiska argument löses inte korrekt
tänk på detta, en generisk klass
export class Query<TResult> {
}
En utökande klass av den typen
export class ListSomeNumbersQuery extends Query<number[]> {
constructor() {
super();
}
}
En besöksklass
class CqsClient {
executeQuery<TResult>(query: Query<TResult>): TResult {
//TODO: implement
}
}
användning
var result = client.executeQuery(new ListSomeNumbersQuery());
Visual Studio IDE förstår inte att result är en talarray. Vad är fel?
redigera: Verkligen ett roligt val av Anders Hejlsberg, Typescript är ett typborttagningsspråk så generics är bara syntaxsocker vid kompilering. Men att lägga till en privat egenskap fungerar
export class Query<TResult> {
private _dummy: TResult;
}
Svar #1
Det händer eftersom du inte använder din typvariabel TResult i din Query-klass.
Från dokumenten:
När vi härleder typen av T i funktionsanropet försöker vi hitta medlemmar av typen T på argumentet x för att ta reda på vad T ska vara. Eftersom det inte finns några medlemmar som använder T finns det inget att härleda från, så vi returnerar {}.
Om du ändrar det till
export class Query<TResult> {
private result: TResult;
}
det kommer korrekt identifiera resultatet som en number[] istället för {}
