TypeScript и JSON со списком объектов в объекте? - PullRequest
0 голосов
/ 04 января 2019

У меня есть вопрос. Почему Typescript с Angular неправильно отображает список объектов в объекте?

В моем сценарии у меня есть компания, в которую входят сотрудники и продукты. Модель TypeScript выглядит так:

import { Product } from "./product";
import { Employee } from "./employee"; //my own classes

export class Company {
  id: number; //my own class
  name: string;

  products: Product[] = []; //company have products and employees
  employees: Employee[] = [];
}

Мой WebApi, то есть ASP .NET WebApi2 возвращает мне JSON, который выглядит следующим образом:

{
  "employees": [
    {
      "userId": "98560542-0202-48b6-b8c5-cde945151527",
      "joinDate": "2015-07-20T00:00:00",
      "companyId": 29
    }
  ],
  "products": [
    {
      "id": 29,
      "name": "xxx",
      "companyId": 29
    },
    {
      "id": 30,
      "name": "zzz",
      "companyId": 29
    }
  ],
  "id": 29,
  "name": "companyName8",
}

Форма ответа выше я получаю employees и products без типа. Предметы там есть только предметы. Чтобы избежать этого, я добавил следующие строки в мой метод subscribe() (где я получил company):

    company: Company = new Company();
    comanyProducts: Products[] = [];

    for (const item of this.company.products) {
          this.companyProducts.push(Object.assign(new Product(), item));
          //this.companyProducts its a new list to store 
          //company's products with proper type of Product
        }

Это не имеет большого значения, когда у меня есть 10 или 100 товаров, но что делать, когда у нас есть 10000 или 100000 товаров в списке? Почему я не могу просто использовать это (из него я просто получаю список Object, а не список Product, который я хочу):

this.companyProducts = this.company.products
//it is in my subscribe

Что я делаю не так и как это исправить?

EDIT

Мой API-интерфейс, который не может обрабатывать список объектов в объекте:

public getObject<T>(
    type: new () => T,
    id: number
  ): Observable<DataResponse<T>> {
    const url = `${this.getUrl(type)}${id}`;
    return this.http.get<T>(url).pipe(
      map((input: Object, indx: number) => {
        const inputObject: T = input as T;
        const outputObject = new type();
        Object.assign(outputObject, inputObject);
        return new DataResponse(outputObject);
      }),
      catchError(this.handleError<T>(`get${type.name} id=${id}`))
    );
  }

//i call it like this: this.dataService.getObject(Company).subscribe(resulut => { this.list = result.object});

Тогда в подписке я просто делаю Object.assign в цикле foor

...