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
};
}
}
我有我的摘要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
};
}
}