Ошибка возникает в угловом подобном типе ‘{}’, который не может быть присвоен типу ‘Product[]’. Свойство ‘length’ отсутствует в типе ‘{}’

#angular

#angular

Вопрос:

Я более свежий разработчик angular, у меня есть следующая спецификация, которая требуется для angular cli — Angular CLI: 7.0.7 Узел: 10.13.0 ОС: win32 x64 Angular: 7.0.4, Но возникает 1 ошибка. ошибка

ОШИБКА в src/app/products/products.component.ts(28,12): ошибка TS2322: тип ‘{}’ не может быть присвоен типу ‘Product[]’. Свойство ‘length’ отсутствует в типе ‘{}’.

product.component.ts

 import { Product } from 'src/app/models/product';
import { ActivatedRoute } from '@angular/router';
import { CategoryService } from './../category.service';
import { ProductService } from './../product.service';
import { Component } from '@angular/core';
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 => {
        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();
  }
} 
  

Ошибка возникает в следующей строке.switchMap(products => {
this.products = products; // Ошибка возникает на этом маршруте
возврата строки.queryParamMap;

Ответ №1:

правильным способом было бы добавить типизацию в ваш сервис следующим образом

 class ProductService {
  getAll() {
    this.http.get<Product[]>(...);
  }
}
  

это приведет к приведению вашего типа ответа к Observable<Product[]> и ошибка исчезнет

Комментарии:

1. Это правильное решение, проверка должна выполняться при получении объекта, а не принудительно в другом месте

Ответ №2:

Возможно, вы захотите изменить

 .switchMap(products => {
...
} 
  

Для

 .switchMap((products: Product[]) => {
...
}