在 Base-Class 中使用 Derived-Class 实例调用 Base-Class 方法和 Derived-class 数据

Using Derived-Class Instance Inside Base-Class to Call Base-Class Method with Derived-class Data

我有一个基础通用组件,我想从基础 class 调用派生方法,该 return 数据属于派生 class.

第一个问题是,我无法在抽象中将其定义为静态 class!

第二个问题是,当我在基本泛型 class 中使用 {} 作为 TDomain 创建派生 class 的新实例时,它的空值和方法 return 空引用错误!

基础实体是这样的:

export abstract class BaseEntity
{
   abstract getColumns():string[];
}

我的模型是这样的:

export class Person extends BaseEntity 
{
    getColumns() {
    return ["Id", "Name"];
  }
}

我有一个通用基础组件:

@Component({
  selector: 'base-component',
  templateUrl: './base.component.html',
  styleUrls: ['./base.component.css']
})
export class BaseComponent<TDomain  extends BaseEntity,TService extends DataService > implements OnInit {
data:any[];

  constructor() {
  }

  ExportToExcel(): void {
    //must create an instance of derived class
    //then call getcolumns method of it
     let obj = {} as TDomain; // but its empty  doesnt work
    ExcelService.export(obj.getcolumns(this.data));

  }
    }

和派生组件:

@Component({
  selector: 'Derived-Cmp',
  templateUrl: './derived.component.html',
  styleUrls: ['./derived.component.css']
})
export class DerivedComponent extends  BaseCrudComponent<Person,PersonService> implements OnInit {

  //ExportToExcel Method called form html 

}

要创建 TDomain 的实例,您需要将 TDomain 的构造函数传递给基础 class:

export abstract class BaseEntity {
    abstract getColumns(): string[];
}

export class Person extends BaseEntity {
    getColumns() { return ["Id", "Name"]; }
}
export class BaseComponent<TDomain extends BaseEntity> {
    data: any[];

    constructor(public ctor: new () => TDomain) {
    }

    ExportToExcel(): void {
        let obj = new this.ctor(); // create instance using the constructor
        obj.getColumns(); /// call method
    }
}

export class DerivedComponent extends BaseComponent<Person> {
    constructor() {
        super(Person)
    }
}

link 表单 github 存储库 call derived class method inside base generic class