当 'restangularized' 响应对象时,Restangular 与 Typescript 混淆
Restangular with Typescript confusing when 'restangularized' response object
我正在使用 Angular 1.5.x 和 TypeScript。为了访问远程 API,我使用 restangular。作为总结,这是我的场景:
我的 API 有以下资源 http://localhost:53384/api/timezones
。使用动词 GET 向 url return 发送一个 JSON 数组的请求:
[
{
"code":"Dateline Standard Time",
"name":"(UTC-12:00) International Date Line West"
},
{
"code":"UTC-11",
"name":"(UTC-11:00) Coordinated Universal Time-11"
},
{
"code":"Hawaiian Standard Time",
"name":"(UTC-10:00) Hawaii"
}
]
现在在我的客户端Angular带有 TypeScript 的 Js 应用程序中:
Restangular 配置为 restangularProvider:restangular.IProvider
restangularProvider.setBaseUrl("http://localhost:53384/api");
TimeZone对象在客户端用typescript表示
module app.blocks {
"use strict";
export class TimeZone {
public code: string;
public name: string;
}
}
Factory(restangular.IService) 包装 restangular all 'timezones' 资源
module app.services {
factory.$inject = ["Restangular"];
function factory(restangular: restangular.IService): restangular.IElement {
return restangular.all("timezones");
}
angular
.module("app.services")
.factory("app.services.TimeZonesRestangular", factory);
}
使用 TimeZonesRestangular 包装其 restangular 功能和 return 以异步方式向任何请求时区的人链接承诺的服务
module app.services {
"use strict";
export interface IStaticDataService {
getTimeZones(): ng.IPromise<app.blocks.TimeZone[]>;
}
class StaticDataService implements IStaticDataService {
constructor(private timeZonesRestangular: restangular.IElement) {
}
public getTimeZones(): ng.IPromise<blocks.TimeZone[]> {
return this.timeZonesRestangular.getList()
.then((timeZones: blocks.TimeZone[]) => {
return timeZones;
}, (restangularError: any) => {
throw "Error retrieving time zones. Status: " + restangularError.status;
});
}
}
factory.$inject = ["app.services.TimeZonesRestangular"];
function factory(timeZonesRestangular: restangular.IElement): IStaticDataService {
return new StaticDataService(timeZonesRestangular);
}
angular
.module("app.services")
.factory("app.services.StaticDataService", factory);
}
最后在控制器中使用服务异步获取 'timezones' 我有这个语句
//..other controller things not relevant for this sample
this.staticDataService.getTimeZones()
.then((timeZones: blocks.TimeZone[]) => {
this.timeZones = timeZones;
});
有两个问题:
restangular 的类型定义(我用 tsd install restangular --resolve --save
安装)告诉我 getTimeZones() 方法中的 successCallback 是一个 promiseValue: any[]
,这很好,因为它确实是一个数组。我认为这将是一个 TimeZone[] 数组并且 typescript 可以正确编译,因为它接受 any[]
,但是当调试时我看到 successCallback 承诺值 它不是 TimeZone[][=69 的数组=].它具有我预期的属性(code
和 name
),但它还有许多其他类似 restangular 的东西。该数组中的对象如下所示(加上一些函数):
{
"code":"Dateline Standard Time",
"name":"(UTC-12:00) International Date Line West",
"route":"timezones",
"reqParams":null,
"restangularized":true,
"fromServer":true,
"parentResource":null,
"restangularCollection":false
}
根据 https://github.com/mgonto/restangular/issues/150 看来我的回复是 "restangularized"。对于像我这样刚接触 restangular 的人的可怕描述。
我应该使用 restangular 类型定义中的什么接口来表示 restangularized TimeZone[]
的数组?
是否有关于如何使用 TypeScript 实现类似功能的示例?
谢谢。
进一步挖掘后,我发现处理此问题的最佳方法是期望类型为 restangular.ICollection
的承诺值(继承自 IService
和 Array<any>
)这样我就可以像这样对响应进行重新调整:
public getTimeZones(): ng.IPromise<blocks.TimeZone[]> {
return this.timeZonesRestangular.getList()
.then((restangularizedTimeZones: restangular.ICollection) => {
return restangularizedTimeZones.plain();
}, (restangularError: any) => {
throw "Error retrieving time zones. Status: " + restangularError.status;
});
}
现在一切似乎都很好,响应确实是 TimeZone[]
的承诺
我正在使用 Angular 1.5.x 和 TypeScript。为了访问远程 API,我使用 restangular。作为总结,这是我的场景:
我的 API 有以下资源 http://localhost:53384/api/timezones
。使用动词 GET 向 url return 发送一个 JSON 数组的请求:
[
{
"code":"Dateline Standard Time",
"name":"(UTC-12:00) International Date Line West"
},
{
"code":"UTC-11",
"name":"(UTC-11:00) Coordinated Universal Time-11"
},
{
"code":"Hawaiian Standard Time",
"name":"(UTC-10:00) Hawaii"
}
]
现在在我的客户端Angular带有 TypeScript 的 Js 应用程序中:
Restangular 配置为 restangularProvider:restangular.IProvider
restangularProvider.setBaseUrl("http://localhost:53384/api");
TimeZone对象在客户端用typescript表示
module app.blocks {
"use strict";
export class TimeZone {
public code: string;
public name: string;
}
}
Factory(restangular.IService) 包装 restangular all 'timezones' 资源
module app.services {
factory.$inject = ["Restangular"];
function factory(restangular: restangular.IService): restangular.IElement {
return restangular.all("timezones");
}
angular
.module("app.services")
.factory("app.services.TimeZonesRestangular", factory);
}
使用 TimeZonesRestangular 包装其 restangular 功能和 return 以异步方式向任何请求时区的人链接承诺的服务
module app.services {
"use strict";
export interface IStaticDataService {
getTimeZones(): ng.IPromise<app.blocks.TimeZone[]>;
}
class StaticDataService implements IStaticDataService {
constructor(private timeZonesRestangular: restangular.IElement) {
}
public getTimeZones(): ng.IPromise<blocks.TimeZone[]> {
return this.timeZonesRestangular.getList()
.then((timeZones: blocks.TimeZone[]) => {
return timeZones;
}, (restangularError: any) => {
throw "Error retrieving time zones. Status: " + restangularError.status;
});
}
}
factory.$inject = ["app.services.TimeZonesRestangular"];
function factory(timeZonesRestangular: restangular.IElement): IStaticDataService {
return new StaticDataService(timeZonesRestangular);
}
angular
.module("app.services")
.factory("app.services.StaticDataService", factory);
}
最后在控制器中使用服务异步获取 'timezones' 我有这个语句
//..other controller things not relevant for this sample
this.staticDataService.getTimeZones()
.then((timeZones: blocks.TimeZone[]) => {
this.timeZones = timeZones;
});
有两个问题:
restangular 的类型定义(我用
tsd install restangular --resolve --save
安装)告诉我 getTimeZones() 方法中的 successCallback 是一个promiseValue: any[]
,这很好,因为它确实是一个数组。我认为这将是一个 TimeZone[] 数组并且 typescript 可以正确编译,因为它接受any[]
,但是当调试时我看到 successCallback 承诺值 它不是 TimeZone[][=69 的数组=].它具有我预期的属性(code
和name
),但它还有许多其他类似 restangular 的东西。该数组中的对象如下所示(加上一些函数):{ "code":"Dateline Standard Time", "name":"(UTC-12:00) International Date Line West", "route":"timezones", "reqParams":null, "restangularized":true, "fromServer":true, "parentResource":null, "restangularCollection":false }
根据 https://github.com/mgonto/restangular/issues/150 看来我的回复是 "restangularized"。对于像我这样刚接触 restangular 的人的可怕描述。 我应该使用 restangular 类型定义中的什么接口来表示 restangularized
TimeZone[]
的数组?是否有关于如何使用 TypeScript 实现类似功能的示例?
谢谢。
进一步挖掘后,我发现处理此问题的最佳方法是期望类型为 restangular.ICollection
的承诺值(继承自 IService
和 Array<any>
)这样我就可以像这样对响应进行重新调整:
public getTimeZones(): ng.IPromise<blocks.TimeZone[]> {
return this.timeZonesRestangular.getList()
.then((restangularizedTimeZones: restangular.ICollection) => {
return restangularizedTimeZones.plain();
}, (restangularError: any) => {
throw "Error retrieving time zones. Status: " + restangularError.status;
});
}
现在一切似乎都很好,响应确实是 TimeZone[]