Angular 4 Свойство не существует для типа Object on build
Я создаю проект с помощью Angular, я начал проект с помощью angular -cli, и когда я пытаюсь запустить ng build --prod
, я продолжаю получать эту ошибку:
Свойство 'description' не существует для типа Object
Код, генерирующий эту ошибку, следующий:
export class AppComponent {
product: Object = {};
constructor(
private store: StoreService,
private request: RequestService,
) {
this.product = this.request.getProduct(_id);
}
}
<p>{{product.description}}</p>
Я читал некоторый контент об этом, и ошибка заключается в том, что я использую определение типа для определения продукта как объекта, но я не передаю какое-либо определение свойства.
Я знаю, что могу определить интерфейс, как я делаю с массивами, но я не мог этого сделать. Я не знаю, определяю ли я это неправильно, вот как я пытался:
export interface ProductInterface {
id: Number;
description: String;
title: String;
}
product: Object<ProductInterface> = {};
Но это также дает мне ошибки. Что мне нужно сделать, чтобы этого избежать?
Ответы
Ответ 1
Для вашего первого примера. В вашем html вы говорите, что у продукта есть описание свойства (которое оно не относится к типу Object)
В вашем втором примере. Первоначально вы определяете продукт как пустой объект
product: ProductInterface = {};
Отсутствует обязательные поля интерфейса. Таким образом, вы можете удалить инициализацию, оставив
product: ProductInterface;
Также, как отмечали другие, вам не нужен синтаксис Object < >
Ответ 2
Прежде всего, я бы просто использовал product: ProductInterface;
, и вам даже не нужно его инициализировать.
Затем, вероятно, это исправит вашу ошибку {{ product?. description }}
Ответ 3
Вы должны определить запрос в методе OnInit, ваш контроллер, который реализует интерфейс OnInit и определяет новый метод
ngOnInit(){
this.product = this.request.getProduct(_id); // who is _id
}
Предполагая, что getProduct() является http-запросом, который возвращает наблюдаемый
this.request.getProduct(_id).subscribe((data) => {
this.product=data;
});
Ответ 4
В моем случае он работал после того, как мои свойства были общедоступными
Итак, просто измените этот
export interface ProductInterface {
id: Number;
description: String;
title: String;
}
к этому
export interface ProductInterface {
public id: Number;
public description: String;
public title: String;
}
Ответ 5
Безопасно использовать any
Object
а не Object
когда данные запрашиваются с сервера, потому что мы не знаем, что будет возвращено с сервера. Таким образом, вам не нужно проверять тип:
export class AppComponent {
product: any;
constructor(
private store: StoreService,
private request: RequestService,
) {
this.product = this.request.getProduct(_id);
}
}
Ответ 6
Из моего дела..
ngOnInit(){
this.product = this.request.getProduct(_id); // who is _id
}
Просто добавив данные: любой при подписке работает нормально.
this.request.getProduct(_id).subscribe((data: any) => {
this.product=data;
});
Это было бы полезно, в то время как данные ответа имеют больше пар ключ-значение. (Так что сложно/трудоёмко создать интерфейс.)