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 {}