2016-02-28 28 views
0

這是打字稿中角度爲$resource的示例使用。在這個例子中,我試圖在我定義的資源上創建更新操作,就像在https://docs.angularjs.org/api/ngResource/service/ $資源中完成一樣。我也返回一個實例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); 
} 

現在的時間來使用資源,資源是通過我的類實現的接口定義。但我仍然得到一個錯誤,我如何讓打字字典識別更新方法。

enter image description here

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'}, 
     ()=> {}); 
    } 
} 

回答

0

很快就意識到,從這個參考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()方法的孩子。