2016-08-03 30 views
0

需要訪問在$resource(例如,remove,query ...)上使用某種默認操作返回的對象的$promise屬性。但現在看來,這是不可能在目前的打字稿定義爲$resource

例子:

我有一個學生資源:

interface IStudentDataModel { 
    name: string 
    age: number 
} 

interface IStudentResource extends IResourceClass<IStudentDataModel> { 
    deactivate(params: Object): IResource<IStudentDataModel> 
} 


export default function ($resource: IResourceService, CONFIG: IConfig): IStudentResource { 
    "ngInject" 

    let deactivateAction: IActionDescriptor = { 
     url: `${CONFIG.api_host}/students/:studentId/deactivate`, 
     method: 'PUT' 
    } 

    return <IStudentResource>$resource(
     `${CONFIG.api_host}/students/:studentId`,   
    } 
     studentId: '@studentId'  
    }, 
    { 
     deactivate: deactivateAction, 
    }); 

} 

然後我使用這個資源在其他服務:

export default class StudentActions { 
    constructor(
     private StudentResource: IStudentResource, 
    ) { 
     "ngInject" 
    } 

    deactivate(studentId: number): IPromise<any> { 
     return this.StudentResource.deactivate({ studnetId: studentId}).$promise; 
    } 

    remove(studentId: number): IPromise<any> { 
     return this.StudentResource.remove({ studentId: studentId}).$promise; //!!!   
    } 
} 

問題:我無法訪問this.StudentResource.remove({ studentId: studentId}).$promise,因爲默認操作有IStudentDataModel作爲return trype inste廣告IResource<IStudentDataModel>(但它返回具有$ promise屬性的資源,不僅是數據模型)。

我試圖重寫remove方法在IStudentResource

interface IStudentResource extends IResourceClass<IStudentDataModel> { 
    deactivate(params: Object): IResource<IStudentDataModel> 
    remove(params: Object): IResource<IStudentDataModel> 
} 

但是編譯器說:

接口 'IStudentResource' 不正確擴展接口 'IResourceClass'。財產'刪除'的類型是 不兼容。 類型'(data:Object)=> IResource'不可分配爲鍵入'IResourceMethod'。

回答

0

這是一個有點粗糙,但你可以爲了使類型檢查站complaning使用類型斷言任何

return (<any>this.StudentResource.deactivate({ studnetId: studentId})).$promise; 

而且由於打字稿接口是開放式的,你也可以修改的IResource接口添加$承諾財產。

interface IResourceClass<T> { 
    $promise: IPromise<T> 
}