Проблема здесь в том, что вы пытаетесь вычислить тип 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
};
}
}