【问题标题】:Angular $resource - accessing to returned resource.$promise in TypeScriptAngular $resource - 在 TypeScript 中访问返回的 resource.$promise
【发布时间】:2016-08-03 08:54:09
【问题描述】:

我需要访问在$resource 上使用一些默认操作返回的对象的$promise 属性(例如删除、查询...)。但在 $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&lt;IStudentDataModel&gt;(但它返回具有$promise 属性的资源,而不仅仅是数据模型)。​​

我试图覆盖IStudentResource中的remove方法:

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

但是编译器说:

接口“IStudentResource”错误地扩展了接口 “资源类”。属性“删除”的类型是 不相容。 类型“(数据:对象)=> IResource”不可分配给类型“IResourceMethod”。

【问题讨论】:

    标签: angularjs typescript angular-resource


    【解决方案1】:

    这有点粗略,但您可以对 any 使用类型断言,以使类型检查停止抱怨。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2014-05-12
      • 1970-01-01
      • 2014-06-29
      • 2016-09-16
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多