如何让打字稿识别 angular $资源上的自定义操作?
How to get typescript to recognize a custom action on the angular $resource?
这是 angular $resource
在打字稿中的使用示例。在这个例子中,我试图在我定义的资源上创建一个更新操作,就像在 https://docs.angularjs.org/api/ngResource/service/$resource 中所做的一样。我还返回了一个实例 ng.resource.IResourceClass<IVenueResource>
module app.common {
interface IVenueService{
}
export interface IVenueResource extends ng.resource.IResource<app.domain.IVenue>{
update(IVenue: app.domain.IVenue) : app.domain.IVenue;
}
export class VenueService implements IVenueService{
static $inject = ["$resource", "url"];
constructor(private $resource: ng.resource.IResourceService, private url: URL_CONSTANTS){
}
getVenueResource(): ng.resource.IResourceClass<IVenueResource>{
// Define custom action as IActionDescriptor
var updateAction : ng.resource.IActionDescriptor = {
method: 'PUT',
isArray: false
};
return <ng.resource.IResourceClass<IVenueResource>>
this.$resource(this.url.BASE_API+"/v1/venues/:id", {id: '@id'} ,{
update: updateAction
});
}
}
angular
.module("common.services")
.service("venueService", VenueService);
}
现在是使用资源的时候了,资源由我的 class 实现的接口定义。但是我仍然遇到错误,如何让打字词典识别更新方法。
module app.Venue {
interface INavigationScope{
venueResource: ng.resource.IResourceClass<app.common.IVenueResource>;
}
class VenueListCtrl implements INavigationScope {
venueResource: ng.resource.IResourceClass<app.common.IVenueResource>;
}
sample(){
var updatedVenue =this.venueResource.update({id: 1, name: 'Amphitheather'},
()=> {});
}
}
很快意识到从这个参考https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/angularjs/angular-resource.d.ts#L85
我应该使用 IResourceClass<IResource<T>>
来扩展我的界面,因为 IResource<T>
没有添加自定义方法的选项。
interface IResourceClass<T> {
new(dataOrParams? : any) : T;
get(): T;
...
}
此外,在使用自定义方法时,我需要分配正确的声明。
interface INavigationScope{ venueResource: app.common.IVenueResource; }
返回 IVenueResourceClass
的实例,它是 ng.resource.IResourceClass<ng.resource.IResource<app.domain.IVenue>>
的子实例,但使用 update()
方法。
这是 angular $resource
在打字稿中的使用示例。在这个例子中,我试图在我定义的资源上创建一个更新操作,就像在 https://docs.angularjs.org/api/ngResource/service/$resource 中所做的一样。我还返回了一个实例 ng.resource.IResourceClass<IVenueResource>
module app.common {
interface IVenueService{
}
export interface IVenueResource extends ng.resource.IResource<app.domain.IVenue>{
update(IVenue: app.domain.IVenue) : app.domain.IVenue;
}
export class VenueService implements IVenueService{
static $inject = ["$resource", "url"];
constructor(private $resource: ng.resource.IResourceService, private url: URL_CONSTANTS){
}
getVenueResource(): ng.resource.IResourceClass<IVenueResource>{
// Define custom action as IActionDescriptor
var updateAction : ng.resource.IActionDescriptor = {
method: 'PUT',
isArray: false
};
return <ng.resource.IResourceClass<IVenueResource>>
this.$resource(this.url.BASE_API+"/v1/venues/:id", {id: '@id'} ,{
update: updateAction
});
}
}
angular
.module("common.services")
.service("venueService", VenueService);
}
现在是使用资源的时候了,资源由我的 class 实现的接口定义。但是我仍然遇到错误,如何让打字词典识别更新方法。
module app.Venue {
interface INavigationScope{
venueResource: ng.resource.IResourceClass<app.common.IVenueResource>;
}
class VenueListCtrl implements INavigationScope {
venueResource: ng.resource.IResourceClass<app.common.IVenueResource>;
}
sample(){
var updatedVenue =this.venueResource.update({id: 1, name: 'Amphitheather'},
()=> {});
}
}
很快意识到从这个参考https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/angularjs/angular-resource.d.ts#L85
我应该使用 IResourceClass<IResource<T>>
来扩展我的界面,因为 IResource<T>
没有添加自定义方法的选项。
interface IResourceClass<T> {
new(dataOrParams? : any) : T;
get(): T;
...
}
此外,在使用自定义方法时,我需要分配正确的声明。
interface INavigationScope{ venueResource: app.common.IVenueResource; }
返回 IVenueResourceClass
的实例,它是 ng.resource.IResourceClass<ng.resource.IResource<app.domain.IVenue>>
的子实例,但使用 update()
方法。