从数据库到 class 的打字稿转换 return
typescript casting return from database to class
我正在使用 ionic 3.20.0 (Angular 5.2.10 && typescript ~2.6.2)[=19] 在离子应用程序中尝试 return 来自我的提供商的特定类型数组=]
在我的提供者中我有这个
export class vwOrderList {
OrderSheetId: number;
Pickup: DateTime;
Orders: number;
Items: number;
Total: number;
BilledAmt: number;
get Done(): boolean {
return this.Total == this.BilledAmt;
}
}
@Injectable()
export class OrderSheetsProvider {
getOrdersList() {
return new Promise<Array<vwOrderList>>(resolve => {
this.http.get('http://*****.elasticbeanstalk.com/odata/vwOrderLists').subscribe(data => {
resolve(<Array<vwOrderList>>data["value"]);
}, err => {
console.log(err);
});
});
}
}
odata 服务 return 是一个对象,其中的数据包含在 "value"
属性 中,看起来像这样:
{
"@odata.context":"http://******.elasticbeanstalk.com/odata/$metadata#vwOrderLists","value":[
{
"OrderSheetId":1589,"Pickup":"2016-09-26T16:00:00Z","Orders":89,"Items":116,"Total":2349.54,"BilledAmt":2349.54
},{
"OrderSheetId":1921,"Pickup":"2016-12-14T10:00:00Z","Orders":142,"Items":204,"Total":3387.22,"BilledAmt":3387.22
},{ ... more
在使用此信息的页面中,我有:
export class OrderListPage {
dataSource: vwOrderList[];
constructor(public navCtrl: NavController, public navParams: NavParams, public ordersProvider: OrderSheetsProvider) {
this.getOrders();
}
getOrders() {
this.ordersProvider.getOrdersList()
.then(data => {
this.dataSource = data;
})
}
}
起初我尝试在使用 return 的页面中转换结果。我尝试使用各种东西
// of course I didn't try these all at once, just one variation at a time
this.dataSource = data as vwOrderList[];
this.dataSource = data as Array<vwOrderList>;
this.dataSource = <Array<vwOrderList>>data;
我无法使其中任何一个起作用,因此我修改了承诺以包含 return 类型 Promise<Array<vwOrderList>>
。无论如何,这更有意义,因为我想在任何地方使用 vwOrderList 类型,它应该是那个类型。但这似乎也不起作用。
resolve(data["value"] as vwOrderList[]);
resolve(data["value"] as <Array<vwOrderList>>);
resolve(data["value"] as Array<vwOrderList>);
resolve(<Array<vwOrderList>>data["value"]);
resolve(Array<vwOrderList>data["value"]);
resolve(<Array<vwOrderList>>(data["value"]));
数据通过,但作为对象数组而不是 vwOrderList 类型,当然,'Done' 方法没有 getter。
如何处理 return 来自我的提供商的 vwOrderList 类型的数组?
TIA,迈克
事实证明,这种方法行不通,即使行得通,也无济于事。 Typescript 是一种设计时便利工具,可以让人们在开发过程中保持数据正确,并有助于智能感知。即使它在开发期间进行了转换,转换为 JavaScript 也会删除转换并且对象不会成为我想要的类型。
我可以通过创建所需类型的数组并使用从数据库返回的元素在 foreach 中创建它们的实例来使其工作。当我尝试这个时它工作正常(我得到了正确的类型)并且它足够快。
getOrdersList() {
return new Promise<Array<vwOrderList>>(resolve => {
this.http.get('http://*****.elasticbeanstalk.com/odata/vwOrderLists').subscribe(data => {
var result = vwOrderList[];
foreach (var element in data['value']) {
result.push(new vwOrderList(element)); // add a constructor to vwOrderList that takes the object
}
resolve(result);
}, err => {
console.log(err);
});
});
}
这并没有真正解决最终目标,即能够编写一个返回适当类型的函数,而不管 class。我希望最终能把它变成 >。打字稿不能那样工作。
麦克
我正在使用 ionic 3.20.0 (Angular 5.2.10 && typescript ~2.6.2)[=19] 在离子应用程序中尝试 return 来自我的提供商的特定类型数组=]
在我的提供者中我有这个
export class vwOrderList {
OrderSheetId: number;
Pickup: DateTime;
Orders: number;
Items: number;
Total: number;
BilledAmt: number;
get Done(): boolean {
return this.Total == this.BilledAmt;
}
}
@Injectable()
export class OrderSheetsProvider {
getOrdersList() {
return new Promise<Array<vwOrderList>>(resolve => {
this.http.get('http://*****.elasticbeanstalk.com/odata/vwOrderLists').subscribe(data => {
resolve(<Array<vwOrderList>>data["value"]);
}, err => {
console.log(err);
});
});
}
}
odata 服务 return 是一个对象,其中的数据包含在 "value"
属性 中,看起来像这样:
{
"@odata.context":"http://******.elasticbeanstalk.com/odata/$metadata#vwOrderLists","value":[
{
"OrderSheetId":1589,"Pickup":"2016-09-26T16:00:00Z","Orders":89,"Items":116,"Total":2349.54,"BilledAmt":2349.54
},{
"OrderSheetId":1921,"Pickup":"2016-12-14T10:00:00Z","Orders":142,"Items":204,"Total":3387.22,"BilledAmt":3387.22
},{ ... more
在使用此信息的页面中,我有:
export class OrderListPage {
dataSource: vwOrderList[];
constructor(public navCtrl: NavController, public navParams: NavParams, public ordersProvider: OrderSheetsProvider) {
this.getOrders();
}
getOrders() {
this.ordersProvider.getOrdersList()
.then(data => {
this.dataSource = data;
})
}
}
起初我尝试在使用 return 的页面中转换结果。我尝试使用各种东西
// of course I didn't try these all at once, just one variation at a time
this.dataSource = data as vwOrderList[];
this.dataSource = data as Array<vwOrderList>;
this.dataSource = <Array<vwOrderList>>data;
我无法使其中任何一个起作用,因此我修改了承诺以包含 return 类型 Promise<Array<vwOrderList>>
。无论如何,这更有意义,因为我想在任何地方使用 vwOrderList 类型,它应该是那个类型。但这似乎也不起作用。
resolve(data["value"] as vwOrderList[]);
resolve(data["value"] as <Array<vwOrderList>>);
resolve(data["value"] as Array<vwOrderList>);
resolve(<Array<vwOrderList>>data["value"]);
resolve(Array<vwOrderList>data["value"]);
resolve(<Array<vwOrderList>>(data["value"]));
数据通过,但作为对象数组而不是 vwOrderList 类型,当然,'Done' 方法没有 getter。
如何处理 return 来自我的提供商的 vwOrderList 类型的数组?
TIA,迈克
事实证明,这种方法行不通,即使行得通,也无济于事。 Typescript 是一种设计时便利工具,可以让人们在开发过程中保持数据正确,并有助于智能感知。即使它在开发期间进行了转换,转换为 JavaScript 也会删除转换并且对象不会成为我想要的类型。
我可以通过创建所需类型的数组并使用从数据库返回的元素在 foreach 中创建它们的实例来使其工作。当我尝试这个时它工作正常(我得到了正确的类型)并且它足够快。
getOrdersList() {
return new Promise<Array<vwOrderList>>(resolve => {
this.http.get('http://*****.elasticbeanstalk.com/odata/vwOrderLists').subscribe(data => {
var result = vwOrderList[];
foreach (var element in data['value']) {
result.push(new vwOrderList(element)); // add a constructor to vwOrderList that takes the object
}
resolve(result);
}, err => {
console.log(err);
});
});
}
这并没有真正解决最终目标,即能够编写一个返回适当类型的函数,而不管 class。我希望最终能把它变成
麦克