return 抽象方法中的动态类型 class <T> TypeScript

return dynamic type in method of abstract class <T> TypeScript

我有我的摘要class

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;
}

和我对抽象过滤器的实现class

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
    };
  }
}

但是我的 ide 在 getFilter 实现中显示错误 尝试使用 getFilter(): IRange<T> 但不起作用

这里的问题是您尝试在泛型类型声明中计算类型 P:您不能这样做。泛型中的等于运算符用于默认值。所以,在这个声明class RangeFilter<T, P = IRange<T>>中,你基本上说RangeFilter class需要2个类型才能工作,如果你不提供第二个,他会默认为IRange<T> , 但您可以为第二种类型提供您想要的内容。

根据您的声明,RangeFilter<xxx, string>RangeFilter<xxx, number> 将完全有效,在这些情况下,getFilter return 值将是错误的。

下面是很好的解决方案

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
    };
  }
}