如何让打字稿识别 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() 方法。