我们正在将现有的angularjs app移植到打字稿。由于这是一项正在进行的工作,我们使用“任何”类型非常重要(只是为了澄清)。
目前我们正在重写其中一个较大的服务,但它大量使用Angular的$http
服务,我正试图弄清楚如何执行以下操作:
我们在一个包含很多功能的服务上公开了一个方法。这是基本课程(dumbed down version):
class MyService implements IMyService {
static $inject = ["$http", "MyException"];
constructor(private $http: ng.IHttpService, private MyException: any) {
}
search(searchType: string, page: number): ng.IPromise<any> {
var apiCall = // Not important.
return this.executeApiCall(apiCall, this.onSearchComplete);
}
private executeApiCall(apiCall: string, onDataComplete: any): ng.IPromise<any> {
var request: any = {
method: "GET",
url: apiCall
};
return this.$http(request).then(onDataComplete);
}
private onSearchComplete(response: any): any {
if(!response.hasOwnProperty(Stuff)) {
var customError = new MyException(); // CAN'T ACCESS MyException!!
}
}
}
我的问题是,由于onSearchComplete
回调是作为委托传递的,因此我不知道如何从中访问MyException
。
this
关键字在该函数的正常意义上不可用,这是我在TS中访问类属性的常规方法。
我尝试使用类似的东西:
return this.executeApiCall(apiCall, this.onSearchComplete.bind(this));
但这似乎没有做任何事情,因为编译的JavaScript与没有bind
的完全相同的语句没有什么不同。
我的Google-foo在这里失败了,因为我还是TypeScript的新手,无法弄清楚如何完成上述工作。
如果我需要提供更多详细信息,请与我们联系。
答案 0 :(得分:1)
首先,MyException未在onSearchComplete
方法范围内定义,它是
var customError = new this.MyException();
this.onSearchComplete.bind(this)
可以完成这项工作。它是JS feature并且在编译时没有做任何事情。但是这样做的最好方法是arrow function,它特别用于在函数内部引入词法this
:
private onSearchComplete = (response: any): any => {
if(!response.hasOwnProperty(Stuff)) {
var customError = new this.MyException();
}
}
事件处理程序是最明显的用例。