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)
);
});
