Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用抽象修复类的重新定义?_Javascript_Angular_Typescript - Fatal编程技术网

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);
    }
}