首页 > 解决方案 > 在抽象类的方法中返回动态类型打字稿

问题描述

我有我的抽象课

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 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>但不工作

标签: typescriptdynamicabstract-class

解决方案


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

有了你的声明,RangeFilter<xxx, string>orRangeFilter<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
    };
  }
}

推荐阅读