Typescript: Тип X не имеет следующих свойств из типа Y length, pop, push, concat и еще 26. [2740]

Вопрос: У меня есть интерфейс продукта: export interface Product{ code: string; description: string; type: string; } Сервис с методом, вызывающим конечную точку продукта: public getProducts(): Observable { return this.http.get('api/products/v1/'); } И компонент, где я использую этот сервис, чтобы получить продукты. export class ShopComponent implements OnInit { public productsArray: Product[]; ngOnInit() { this.productService.getProducts().subscribe(res => { this.productsArray

Вопрос:

У меня есть интерфейс продукта:

export interface Product{ code: string; description: string; type: string; }

Сервис с методом, вызывающим конечную точку продукта:

public getProducts(): Observable<Product> { return this.http.get<Product>(‘api/products/v1/’); }

И компонент, где я использую этот сервис, чтобы получить продукты.

export class ShopComponent implements OnInit { public productsArray: Product[]; ngOnInit() { this.productService.getProducts().subscribe(res => { this.productsArray = res; }); } }

С этим состоянием я получаю ошибку:

[ts] В типе “Product” отсутствуют следующие свойства типа “Product []”: длина, всплывающее, push, concat и еще 26. [2740]

Удаление ввода в переменной productsArray устраняет ошибку, но не понимаете, почему это не работает, поскольку ответ сервера представляет собой массив объектов в типе Products?

Лучший ответ:

Вы возвращаете Observable<Product> и ожидаете, что он будет Product[] внутри обратного вызова subscribe.

Тип, возвращаемый из http.get() и getProducts(), должен быть Observable<Product[]>

public getProducts(): Observable<Product[]> { return this.http.get<Product[]>(‘api/products/v1/’); } Ответ №1

Вы забыли пометить тип возвращаемого значения getProducts как массив. В вашем getProducts говорится, что он вернет один продукт. Так что измените это на это:

public getProducts(): Observable<Product[]> { return this.http.get<Product[]>(‘api/products/v1/’); } Ответ №2

Я новичок в Angular и сталкиваюсь с подобной проблемой, не в состоянии выяснить, как применить решение в моем случае, ниже приведен мой код, у меня есть массив продуктов, который я назначаю для этого.продукты внутри switchMap наблюдаются. Я возвращаю список продуктов из Firebase DB, так что не уверен, как заставить его возвращать массив типов.

//Я получаю сообщение об ошибке ниже строки для this.products this.products = products;

product.component.ts

import { Component, OnInit } from ‘@angular/core’; import { ProductService } from ‘../product.service’; import { CategoryService } from ‘../category.service’; import { ActivatedRoute } from ‘@angular/router’; import { Product } from ‘../models/product’; import ‘rxjs/add/operator/switchMap’; @Component({ selector: ‘app-products’, templateUrl: ‘./products.component.html’, styleUrls: [‘./products.component.css’] }) export class ProductsComponent { products: Product[] = []; filteredProducts: Product[] = []; categories$; category: String; constructor( route:ActivatedRoute, productService: ProductService, categoryService: CategoryService ) { productService .getAll() .switchMap(products => { // I am getting error below line for this.products this.products = products; return route.queryParamMap; }) .subscribe(params => { this.category = params.get(‘category’); this.filteredProducts = (this.category) ? this.products.filter(p => p.category === this.category) : this.products; }); this.categories$ = categoryService.getAll(); } }

product.service.ts

import { Injectable } from ‘@angular/core’; import { AngularFireDatabase } from ‘angularfire2/database’; @Injectable({ providedIn: ‘root’ }) export class ProductService { constructor(private db: AngularFireDatabase) { } create(product){ return this.db.list(‘/products’).push(product); } getAll(){ return this.db.list(‘/products’);//to get list of all products } get(productId){ return this.db.object(‘/product/’ + productId); } }

Оцените статью
Добавить комментарий