typescript - Typescript父类方法返回类型由子属性更改
问题描述
有没有办法让类的父类使用的方法返回准确的类型(当它用于派生类型的属性发生更改时)?
例子:
abstract class A {
a: string
constructor(a: string) {
this.a = a;
}
}
class B extends A {
b: string
constructor(a: string, b: string) {
super(a);
this.b = b;
}
}
abstract class AColl {
abstract itemsMap: Map<string, A>
items() {
return [...this.itemsMap.values()];
}
}
class BColl extends AColl {
itemsMap: Map<string, B>
}
const bColl = new BColl();
bColl.items() -> Map<string, A> instead of Map<string,B>
在此示例中,Intellisense 认为这是 Map<string, A> 而不是 Map<string,B>,尽管我认为它能够派生正确的类型(也许我的想法很幼稚),但我可以得到它。
有没有办法实现这一点而不必在子类上重新实现该方法?
解决方案
为什么不只是参数化基类:
abstract class AColl<V extends A = A> {
itemsMap: Map<string, V>; // no need to be abstract when class'es type param is used.
items(): V[] {
return [...this.itemsMap.values()];
}
}
class BColl extends AColl<B> {
// no need to have itemsMap field - extends AColl<B> does the job.
}
const bColl = new BColl();
bColl.items()
推荐阅读
- reactjs - CKEditor CKFinder React 图像复制粘贴不起作用
- pytorch - 如何在 Pytorch 中为 train 和 val 数据加载器使用相同的 num_workers
- c# - SearchResultCollection:循环遍历每条记录非常慢
- github - 在 Github Actions 中设置 CI,每次推送到 repo 时都会修改 Readme 的一部分(整个 repo 的树结构)
- ripple - 如何获取令牌列表,以及令牌的详细信息,例如十进制、名称
- react-native - 如何像这种设计一样在本机反应中为 View 设置 clipPath?
- python - Docker:uwsgi-nginx - 进程和线程不工作
- linux - 为什么这个 VLOOKUP 风格的命令不起作用?
- ios - AVPlayerLayer 为零
- python - 网页抓取时如何从动态呈现的网页中获取更多项目