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;
});

Это было бы полезно, в то время как данные ответа имеют больше пар ключ-значение. (Так что сложно/трудоёмко создать интерфейс.)