Javascript 如何使用抽象修复类的重新定义?
我有一个抽象类:Javascript 如何使用抽象修复类的重新定义?,javascript,angular,typescript,Javascript,Angular,Typescript,我有一个抽象类: export abstract class Tree<T extends TreeChildrenNodes<T>> { abstract initialize(source: T, treeControl: NestedTreeControl<T>): void; toggle() { // TODO } expand() { // TODO }
export abstract class Tree<T extends TreeChildrenNodes<T>> {
abstract initialize(source: T, treeControl: NestedTreeControl<T>): void;
toggle() {
// TODO
}
expand() {
// TODO
}
collapse() {
// TODO
}
}
interface Tree {
showNodeInf?(node: NodeTree): void;
}
问题是,在组件内部,我现在不知道树的具体类型,它可以被注入TreeLayer
或TreeMap
。因此,我不能用这个:
public showNodeInf(node): void {
this.tree.showNodeInf(node); //Here is problem
}
因为如果方法showNodeInf(node)
被注入TreeMap
实例,那么该方法显然存在
重要提示:组件充当中介。更新答案
更好的选择是将带有可选方法的接口连接到抽象类中,在这种情况下,您可以有可选方法,因此只有在它们存在时才调用它们
只需在抽象类之前添加以下接口:
export abstract class Tree<T extends TreeChildrenNodes<T>> {
abstract initialize(source: T, treeControl: NestedTreeControl<T>): void;
toggle() {
// TODO
}
expand() {
// TODO
}
collapse() {
// TODO
}
}
interface Tree {
showNodeInf?(node: NodeTree): void;
}
并使用可选链调用该方法:
public showNodeInf(node): void {
this.tree.showNodeInf?.(node);
}
先前的答复
对于此类用例,您可以使用构造函数名称属性并标识对象类名:
this.tree.constructor.name // Which should return TreeLayer or TreeMap
然后通过强制转换对象,您应该能够调用特定于一个对象的函数
public showNodeInf(node): void {
if (this.tree.constructor.name === 'TreeMap') {
(this.tree as TreeMap).showNodeInf(node);
}
}
你在说什么模板?是的,如果
TreeComponent
应该与任意tree
实现一起工作,那么它不能使用不属于接口的方法。它根本不应该负责做showNodeInf
之类的事情。我说的是带DOM的HTNL模板,你是说HTML?这与您的TypeScript类组件有什么关系?您使用的是框架吗?在您的代码中,您在哪里与DOM交互?我使用Angular,因此该组件作为中介,它与TreeItracts的具体实现交互。如果有很多具体实现,那么它就不好了。我知道,在这种情况下,我有一个更新答案,可能满足您的需要。
this.tree.constructor.name // Which should return TreeLayer or TreeMap
public showNodeInf(node): void {
if (this.tree.constructor.name === 'TreeMap') {
(this.tree as TreeMap).showNodeInf(node);
}
}