TypeScript 0.9 Generics: JQueryPromise<T> resultat kompileras till JQueryPromise<any>


Jag använder för närvarande TypeScript 0.9.0.1 och använder JQueryPromise-gränssnittet när jag gör AJAX-anrop. Jag har precis börjat implementera den nya generiska funktionaliteten och märkte att jag inte får intellisense när jag anropar en generisk funktion med typen satt i den anropade funktionen.

Jag skulle vilja anropa userService.GetRole() och returnera typen JQueryPromise< Role > men det gör det inte i detta scenario... det returnerar JQueryPromise< any > och intellisense fungerar inte på 'role'-variabeln:

/// <reference path="../declarations/jquery.d.ts" />

interface Role {
    Id: number;
    Name: string;
}

module Services {

    export class UserService {

        //Non-Generic Call
        GetRole<Role>(): JQueryPromise<Role>{
            return $.get('/url');
        }

    }

}

$(function () {

    var userService = new Services.UserService();

    //GetRole() is returning JQueryPromise<any> and not JQueryPromise<Role> as declared
    userService.GetRole().then((role) =>
        //role is inferred as type 'any' and not 'Role' so intellisense does not work
        console.log(role.Name)
    );

});

Följande ger mig intellisense men jag skulle behöva skriva userService.GetRole< Role >() istället för bara userService.GetRole():

/// <reference path="../declarations/jquery.d.ts" />

interface Role {
    Id: number;
    Name: string;
}

module Services {

    export class UserService {

        //Generic Call
        GetRole<T>(): JQueryPromise<T> {
            return $.get('/url');
        }

    }

}

$(function () {

    var userService = new Services.UserService();

    userService.GetRole<Role>().then((role) =>
        //Intellisense now works but I have pass the type '<Role>' every call
        console.log(role.Name)
    );

});

Så min fråga är: Finns det ett sätt att göra anropet userService.GetRole().then((role) ...etc. med parametern 'role' igenkänd som typen 'Role'?

Svar #1

Beror på vilken nivå du vill att generics ska bli aktiva. t.ex. du kan flytta det till din klass:

module Services {

    //Generic Class
    export class UserService<T> {    

        GetRole(): JQueryPromise<T> {
            return $.get('/url');
        }    
    }    
}

$(function () {

    var userService = new Services.UserService<Role>();

    // You don't need role in every call anymore 
    userService.GetRole().then((role) =>
        console.log(role.Name)
    );    
});