Angular $资源 - 访问返回的资源。$ Type中的promise

时间:2016-08-03 08:54:09

标签: angularjs typescript angular-resource

我需要访问$promise上的某个默认操作返回的对象的$resource属性(例如,删除,查询...)。但在$resource的当前TypeScript定义中似乎无法实现:

示例:

我有学生资源:

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作为返回trype而不是IResource<IStudentDataModel>(但它返回带有$ promise属性的资源,而不仅仅是数据模型)。

我试图覆盖IStudentResource中的删除方法:

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

但是编译器说:

  

接口'IStudentResource'错误地扩展了接口   'IResourceClass'。财产'删除'的类型是   不相容。       输入'(data:Object)=&gt; IResource'不能分配给'IResourceMethod'类型。

1 个答案:

答案 0 :(得分:0)

它有点粗糙,但您可以使用类型断言任何,以使类型检查停止抱怨。

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

此外,由于打字稿接口是开放式的,您还可以修改IResource接口以添加 $ promise 属性。

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