打字稿:类型X缺少类型Y的长度,弹出,推入,连拍等26个以下属性。[2740]

mpr*_*pro 24 typescript typescript-typings angular

我有产品界面:

export interface Product{
  code: string;
  description: string;
  type: string;
}
Run Code Online (Sandbox Code Playgroud)

使用方法调用产品端点的服务:

  public getProducts(): Observable<Product> {
    return this.http.get<Product>(`api/products/v1/`);
  }
Run Code Online (Sandbox Code Playgroud)

我使用此服务获取产品的组件。

export class ShopComponent implements OnInit {
    public productsArray: Product[];

    ngOnInit() {
        this.productService.getProducts().subscribe(res => {
          this.productsArray = res;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种状态下,我得到了错误:

[ts]类型“产品”缺少类型“产品[]”中的以下属性:长度,弹出,推入,连续和另外26个。[2740]

删除productsArray变量上的类型可消除该错误,但不知道为什么此方法不起作用,因为服务器响应是类型为Products?的对象数组。

Ami*_*ani 35

您正在返回Observable<Product>并期望它Product[]位于subscribe回调内部。

从返回的类型http.get()getProducts()Observable<Product[]>

public getProducts(): Observable<Product[]> {
    return this.http.get<Product[]>(`api/products/v1/`);
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:这需要“import { Observable } from 'rxjs';” 在服务类别中 (4认同)

小智 8

您必须指定响应的类型:

this.productService.getProducts().subscribe(res => {
    this.productsArray = res;
});
Run Code Online (Sandbox Code Playgroud)

尝试这个:

this.productService.getProducts().subscribe((res: Product[]) => {
    this.productsArray = res;
});
Run Code Online (Sandbox Code Playgroud)


Fre*_*ond 7

您忘记将getProducts返回类型标记为数组。在您的getProducts中,它表示将返回单个产品。因此,将其更改为:

public getProducts(): Observable<Product[]> {
    return this.http.get<Product[]>(`api/products/v1/`);
  }
Run Code Online (Sandbox Code Playgroud)


Bra*_*ang 7

对于像我这样的新手,不要为服务响应分配变量,这意味着做

export class ShopComponent implements OnInit {
  public productsArray: Product[];

  ngOnInit() {
      this.productService.getProducts().subscribe(res => {
        this.productsArray = res;
      });
  }
}
Run Code Online (Sandbox Code Playgroud)

代替

export class ShopComponent implements OnInit {
    public productsArray: Product[];

    ngOnInit() {
        this.productsArray = this.productService.getProducts().subscribe();
    }
}
Run Code Online (Sandbox Code Playgroud)