在 TypeScript 的继承类方法中动态返回继承的类类型



我有一个类

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(/* ... */)
}
}

我不确定oldChildnewChild是否也应该this,或者Node,或者什么。 你必须决定这一点。

现在测试:

class Block extends Node {
// ...
}
const block = new Block();
const newMutatedBlock: Block = block.replaceChild(oldChild, newChild);

这是有效的(假设oldChildnewChild存在并且是正确的类型),因为Block.replaceChild()返回一个Block而不仅仅是一个Node

在操场上看到它的工作

希望有帮助;祝你好运!

最新更新