typescript - 在抽象类的方法中返回动态类型打字稿
问题描述
我有我的抽象课
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>
但不工作
解决方案
这里的问题是您尝试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
};
}
}
推荐阅读
- angular - 打字稿查询字符串值到 GUID
- alpha - kubeadm alpha 阶段 etcd 本地 - 使用 localhost 绑定而不是主机 ip 创建 etcd
- python - 添加嵌套包以安装需要,setup.py
- jdk1.7 - jdk1.7 Double.parseDouble 在计算量大的多线程条件下变慢
- c# - 视频时长是应有的两倍
- centos7 - 在没有 Sudo 的情况下启动 haproxy:启动前端 http-in:无法绑定套接字
- excel - 将多个工作簿最后一行的数据复制并粘贴到另一个工作簿中的工作表中
- c++ - 它是 Eratosthenes 筛的有效代码吗?
- amazon-web-services - Redshift/S3 数据是否混合在一起?
- cython - 为什么 Cython 使用 gcc 优化?