У меня есть вопрос. Почему 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