typescript - 基类返回对扩展类类型不匹配的引用
问题描述
我有一个基类的简化版本,它应该是树结构的一个节点,并持有对其父级的引用。
class Node {
parent: Node;
setParent(a: Node) {
this.parent = a;
}
getParent(): Node {
return this.parent;
}
}
派生类为基本节点添加了更多功能
class NamedNode extends Node {
name: string;
setName(name: string) {
this.name = name;
}
}
我使用派生类创建我的小树,并通过调用setParent
将对父级的引用存储在子级中,然后通过调用从子级检索父级getParent
。
const parent = new NamedNode();
const child = new NamedNode();
child.setParent(parent);
const parentOfChild = child.getParent();
parentOfChild.setName('foo');
当我setName
对检索到的父级进行调用时,即使它是 的实例NamedNode
,TypeScript 也会引发错误
类型“节点”上不存在属性“setName”。
我可以理解,因为方法签名getParent(): Node
明确定义它只返回实例Node
并且它没有setName
方法。
我的问题是如何让getParent
return 的一个实例,Node
所以我会知道返回值将具有 a 的方法Node
,但同时它应该对扩展开放,这样我就可以在没有返回值的情况下调用后代方法打字稿抱怨。我的目标是每个后代节点类都有Node
方法,然后这些后代类的实例可以在基Node
类中用作parent
参考。我还想避免Node
在派生类中重写方法来更新Node
方法签名,因为继承方法重用的全部意义将不复存在。
解决方案
您可以将this
类型用作表示当前类的类型,以便在派生类中与派生类parent
具有相同的类型:
export class Node {
parent: this;
setParent(a: this) {
this.parent = a;
}
getParent(): this {
return this.parent;
}
}
class NamedNode extends Node {
name: string;
setName(name: string) {
this.name = name;
}
}
const parent = new NamedNode();
const child = new NamedNode();
child.setParent(parent);
const parentOfChild = child.getParent();
parentOfChild.setName('foo');
推荐阅读
- c++ - 为什么 cin >> ws 使程序在末尾有空格时不终止?
- python - 使用 GridSearchCV 进行逻辑回归时的精度计算警告
- excel - VBA - 即使匹配是收件箱中的第一封电子邮件,代码也需要 5 分钟以上的时间来搜索收件箱 - 我该如何加快速度?
- xml - xsl position() 总是返回“1”
- arrays - Postgres SQL:如何创建约束以检查元素不在字符串数组中
- sql - 透视连接表
- trigonometry - (wx) Maxima:重新定义用于括号的 tex,当应用指数时
- python - 在我的 Python API POST 请求中使用替换时 POST 失败
- python - 在此服务器上找不到 URL?(Python)
- reactjs - 是否可以将 firestore 错误添加到 redux 商店?