从数据库到 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。我希望最终能把它变成 >。打字稿不能那样工作。

麦克