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

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-вызова, связанного с пользователем, параметр типа будет HttpResponse<UserModel>> или для вызова, связанного с ресурсами, это будет HttpResponse<ResourceModel>>. Однако мне, похоже, не повезло, когда я пробовал это.

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

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

Затем у меня есть служба, которая расширяет этот класс и перегружает метод 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 от сервера может быть автоматически сопоставлен с соответствующим типом, что упрощает использование ответа во всем приложении.

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

0
dionm 23 Сен 2018 в 23:48

1 ответ

Лучший ответ

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

0
Matt McCutchen 24 Сен 2018 в 16:23