Передать универсальный тип в качестве параметра типа - PullRequest
0 голосов
/ 23 сентября 2018

Я изо всех сил пытаюсь найти решение проблемы, с которой я сталкиваюсь, где я пытаюсь использовать универсальный тип в качестве параметра типа.У меня есть следующие два класса / типа:

UserModel.ts:

export class UserModel{

  private _id : string;
  public get id() : string {
      return this._id;
  }
  public set id(v : string) {
      this._id = v;
  }

  ....
}

HttpResponse.ts:

export class HttpResponse<T>{

  private _success : boolean;
  public get success() : boolean {
      return this._success;
  }
  public set success(v : boolean) {
      this._success = v;
  }

  private _model : T;
  public get model() : T {
      return this._model;
  }
  public set model(v : T) {
      this._model = v;
  }
}

Как вы можете догадаться, я использую этоиметь универсальный тип для простой обработки вызовов http.Предполагаемое использование - вызвать мой http-метод с типом HttpResponse и независимо от того, какой ожидаемый тип результата указан в качестве параметра типа.Например, при выполнении http-вызова, связанного с пользователем, параметр type будет HttpResponse<UserModel>> или для вызова, связанного с ресурсом, это будет HttpResponse<ResourceModel>>.Тем не менее, мне, кажется, не повезло, когда я пытаюсь это сделать.

В моей службе данных у меня есть метод, который ВЫСТАВЛЯЕТ на сервер, называется 'create' и

create<T>(data: any){
  //Angular's HttpClient
  return this.http.post<T>(data, ...);
}

Iзатем есть служба, которая расширяет этот класс и перегружает метод create некоторыми дополнительными битами, прежде чем он вызовет super.create.Я столкнулся с проблемой на этом этапе, потому что я хочу передать HttpResponse<Type the service should return>, который в следующем случае будет HttpResponse<UserModel>:

create<HttpResponse<UserModel>>(user: UserModel){
  //stuff happens here
  return super.create<HttpResponse<UserModel>>(user, ...);
}

Однако это возвращает синтаксическую ошибку на create<HttpResponse<UserModel>>.Я посмотрел в Интернете и нашел другой способ достичь этого как что-то вроде:

create<HttpResponse, UserModel>(user: any){
  //stuff happens here
  return super.create<HttpResponse<UserModel>>(user, ...);
}

Но, опять же, это возвращает ошибку, в которой говорится, что «HttpResponse не является универсальным».

Идея проекта состоит в том, что, передавая таким образом типы, ответ json от сервера может автоматически отображаться в соответствующий тип, что упрощает использование ответа во всем приложении

Какие-нибудь указатели относительно того, где я иду не так в моем дизайне?

1 Ответ

0 голосов
/ 24 сентября 2018

Подкласс должен поддерживать весь интерфейс своего базового класса (с некоторыми исключениями, которые здесь не актуальны).Если ваш базовый класс службы данных содержит общий метод create, который работает для каждый T, то ваш подкласс не может переопределить create с помощью метода, который работает только для T = HttpResponse<UserModel>.Вместо этого рассмотрим (1) определение нового метода с другим именем или (2) перемещение параметра T из метода create в сам базовый класс, чтобы, когда ваш подкласс расширял базовый класс, он мог указатьсингл T, с которым он работает.(Сравните с этим недавним вопросом .) Если вам кажется, что это не то, что вам нужно, предоставьте больше информации.

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