TS2339: свойство 'map' не существует для типа 'Object' - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть следующий код:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import { map } from 'rxjs/operators';

interface SingleParamConstructor<T> {
  new (response: any): T;
  id: T;
}

@Injectable()
export class RestProvider<T> {
  baseUrl:string = "http://localhost:3000";

  constructor(private ctor: SingleParamConstructor<T>, private httpClient : HttpClient) { }

  public getEntities<T>(): Observable<T[]> {
    return this.httpClient
      .get(this.baseUrl + '/products')
      .pipe(map(entities => {
        return entities.map((entity) => new this.ctor(entity));
      }))
      .catch((err) => Observable.throw(err));

  }
}

Когда я пробую код выше, я получаю TS2339: Property 'map' does not exist on type 'Object'.

Ответственная линия: return entities.map((entity) => new this.ctor(entity));

Что я делаю не так и как я могу нанести на карту entities?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Вы не указываете angular в get, какой тип данных вы получаете, поэтому Angular автоматически предполагает, что это анонимный объект, поскольку именно этот Angular httpclient анализирует данные для ,Также что-то не связанное, так как вы используете rxjs 6 -> используйте catchError вместо .catch:

import { catchError, map } from 'rxjs/operators';
import { of } from 'rxjs';

// ...

public getEntities<T>(): Observable<T[]> {
  return this.httpClient
    // note below, now angular knows it's an array!
    .get<T[]>(this.baseUrl + '/products')
    .pipe(
       map(entities => {
        return entities.map((entity) => new this.ctor(entity));
       }),
       catchError((err) => of(err))
    )
}
1 голос
/ 28 апреля 2019

Я почти уверен, что вы получаете (entities) объект, который не может быть повторен.

Измените pipe(map на pipe(tap и выполните console.log, чтобы увидеть, чтовы получаете с сервера,

.pipe(tap(entities => console.log(entities));

Затем, если вам нужно перебрать реквизиты объекта, выполните Object.keys (myObj), который возвращает массив.

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...