вернуть динамический c тип в методе абстрактного класса <T>TypeScript - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть мой класс отвлечения

export abstract class Filters<P> {
  protected field: string;

  protected constructor(field: string) {
    this.field = field;
  }

  protected abstract getFilter(): P;
}

и один интерфейс

interface IRagne<T> {
  field: string;
  from: T;
  to: T;
}

и моя реализация абстрактного класса Filters

class RangeFilter<T, P = IRagne<T>> extends Filters<P> {
  private from: T;
  private to: T;

  constructor(field: string, from: T, to: T) {
    super(field);
    this.from = from;
    this.to = to;
  }

  getFilter(): P {
    return {
      field: super.field,
      from: this.from,
      to: this.to
    };
  }
}

, но мой идеал показывает ошибка в getFilter реализации, попробуйте с getFilter(): IRange<T>, но не работаете

1 Ответ

1 голос
/ 07 апреля 2020

Проблема здесь в том, что вы пытаетесь вычислить тип P в обобщенном объявлении типов c: вы не можете этого сделать. В качестве значения по умолчанию используется оператор равенства в типе generi c. Итак, в этом объявлении class RangeFilter<T, P = IRange<T>> вы в основном говорите, что RangeFilter классу нужно 2 типа для работы, и если вы не предоставите второй, он по умолчанию будет IRange<T>, но вы можете предоставить то, что вы хотите для этого второй тип.

С вашей декларацией, RangeFilter<xxx, string> или RangeFilter<xxx, number> будут совершенно правильными, и в этих случаях возвращаемое значение getFilter будет неправильным.

Хорошим решением здесь является следующее

class RangeFilter<T> extends Filters<IRange<T>> {
  private from: T;
  private to: T;

  constructor(field: string, from: T, to: T) {
    super(field);
    this.from = from;
    this.to = to;
  }

  getFilter(): IRange<T> {
    return {
      field: super.field,
      from: this.from,
      to: this.to
    };
  }
}
...