приведение приведения машинописного текста из базы данных в класс - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь вернуть массив определенного типа от моего провайдера в ионном приложении, используя ionic 3.20.0 (Angular 5.2.10 && typcript ~ 2.6.2)

В моем провайдере у меня есть это

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 возвращает объект, в котором данные содержатся в свойстве "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;
            })
    }
}

Сначала я попытался привести результат на страницу, которая использует возврат.Я пытался использовать разные вещи

// 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;

Я не мог заставить их работать, поэтому вместо этого я изменил обещание, включив в него тип возврата 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, конечно, не имеют геттера для «Готово»Метод.

Что мне делать, чтобы вернуть массив типа vwOrderList от моего провайдера?

TIA, Mike

1 Ответ

0 голосов
/ 08 июня 2018

Как выясняется, это просто не сработает, и даже если бы это сработало, это все равно не помогло бы.Typescript - удобство времени разработки для людей, позволяющее хранить данные прямо во время разработки и помогать с intellisense.Даже если бы он выполнял приведение во время разработки, преобразование в 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);
        });
    });
}

Это на самом деле не решало конечную цель, которая состояла в том, чтобы написать одну функцию, котораявернул соответствующий тип независимо от класса.Я надеялся в конце концов превратить его в >.Машинопись просто так не работает.

Майк

...