TypeScript 0.9 泛型:JQueryPromise<T> 结果编译为 JQueryPromise<any>



我目前正在使用TypeScript 0.9.0.1,并在进行AJAX调用时使用JQueryPromise接口。我刚刚开始实现新的泛型功能,并注意到在使用被调用函数中设置的类型调用泛型函数时,我没有获得intellisense。

我想调用userService.GetRole()并返回类型JQueryPromise<角色>但在这种情况下没有。。。则返回JQueryPromise<any>和intellisense对"角色"变量不起作用:

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

以下内容确实给了我智能感知,但我必须键入userService.GetRole<Role>()而不仅仅是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)
    );
});

所以我的问题是:是否有一种方法可以使调用userService.GetRole().then((role)…etc.将"role"参数识别为类型"role"

取决于您希望泛型变为活动的级别。你可以把它移到你的班级:

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

最新更新