我有一个类
class Node {
children: Node[];
}
由其他几个类继承
class Block extends Node {
// ...
}
在所有继承的类中,我希望有一个名为replaceChild的函数:
const block = new Block();
block.replaceChild(oldChild, newChild);
我不想在所有继承的类中实现这个函数(呃!不过这里的线索是我的类是不可变的,所以我想返回一个带有更改children
的新实例,而不是改变类。问题是,我想在Node
中实现的函数replaceChild
不应该返回Node
实例,而是返回继承类的实例:
class Node {
children: Node[];
replaceChild(oldChild, newChild): Node {
// ...
return new Node(/* ... */)
}
}
class Block extends Node {
// ...
}
const block = new Block();
const newMutatedBlock: Block = block.replaceChild(oldChild, newChild);
我正在使用TypeScript
.如何告诉 TypeScript(每次都没有类型转换)Block
节点上replaceChild
的方法返回Block
而不是Node
?
您正在寻找多态this
,一种对应于this
对象的类型。 不是说replaceChild()
返回类型Node
,而是说它返回类型this
。
请注意,你不能在replaceChild()
的实现中只调用new Node()
,因为这不会正确地创建你的子类。 幸运的是,类的实例包含对其构造函数的引用,因此您可以调用new this.constructor()
。 不幸的是,TypeScript 除了Function
之外,对this.constructor
一无所知。 幸运的是,您可以声明this.constructor
具有new()=>this
类型并安全地使用它。 (由您来正确声明参数类型并确保所有子类构造函数都采用相同的参数类型)。 下面是它的外观:
class Node {
children: Node[];
"constructor": new (/* ... */) => this;
replaceChild(oldChild, newChild): this {
// ...
return new this.constructor(/* ... */)
}
}
我不确定oldChild
和newChild
是否也应该this
,或者Node
,或者什么。 你必须决定这一点。
现在测试:
class Block extends Node {
// ...
}
const block = new Block();
const newMutatedBlock: Block = block.replaceChild(oldChild, newChild);
这是有效的(假设oldChild
和newChild
存在并且是正确的类型),因为Block.replaceChild()
返回一个Block
而不仅仅是一个Node
。
在操场上看到它的工作
希望有帮助;祝你好运!