Вызов конструктора универсального типа в TypeScript - PullRequest
2 голосов
/ 01 мая 2019

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

  public getProducts<T>(): Observable<T[]> {
    return this.httpClient
      .get<T[]>(this.baseUrl + '/users')
      .pipe(
        map((entities) => {
          return entities.map((entity) => {
            return new T(entity);
          })
        }),
        catchError((err) => Observable.throw(err))
      );
  }

В этой строке выдается ошибка: return new T(entity);

Как я могу вызвать конструктор универсального типа в TypeScript?

1 Ответ

3 голосов
/ 01 мая 2019

T - это просто тип, типы стираются во время выполнения, поэтому типы не могут появляться в выражениях.

Вам нужно вместо этого передать в конструктор T.

  public getProducts<T>(ctor: new (p: Partial<T>) => T): Observable<T[]> {
    return this.httpClient
      .get<T[]>(this.baseUrl + '/users')
      .pipe(
        map((entities) => {
          return entities.map((entity) => {
            return new ctor(entity);
          })
        }),
        catchError((err) => Observable.throw(err))
      );
  }

Это означает, что у вас есть класс, определенный для T.Если класса нет, не беспокойтесь о new T.Если T является интерфейсом, то объекты, возвращаемые сервером, предположительно будут удовлетворять интерфейсу, и больше ничего делать не нужно /

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