2017-10-19 60 views
0

我有一个泛型类,需要创建一个带有一些参数的实例。我发现如何创建一个空的构造函数的实例,但是当我尝试重载它时,我得到一个错误:'ERROR TypeError:rowObj不是构造函数'如何用typescript中的参数创建<T>的实例?

这是旧的代码工作(但具有空的构造函数) :

export class DataTableViewModel<TRow extends DataTableRowViewModel> { 
public rowsViewModel: TRow[]; 
public totalItemsCount: number; 

constructor(dateService: DateService, rows?: any[]) { 
    this.rowsViewModel = []; 
    if (rows) { 
     rows.forEach((row) => { 
      let obj = Object.getPrototypeOf(Object.create(row) as TRow); 
      this.rowsViewModel.push(obj); 
     }); 
    } 
} 
} 

这里是我努力使工作的新代码:

export abstract class DataTableViewModel<TRow extends DataTableRowViewModel> { 
public rowsViewModel: TRow[]; 
public totalItemsCount: number; 

constructor(dateService: DateService, rows?: { new(): any }[]) { 
    this.rowsViewModel = []; 
    if (rows) { 
     let rowObj: { new(dateService: DateService, rows?: any): TRow }; 
     rows.forEach((row) => { 
      let obj = new rowObj(dateService, row); 
      this.rowsViewModel.push(obj); 
     }); 
    } 
} 
} 
+0

什么是DataTableRowViewModel?它的构造函数的签名是什么? – jcalz

+0

@jcalz现在只是一个空的类,没有任何声明的构造函数 – Igor

回答

1

你声明的变量rowObj,但你还没有初始化它。您将需要为其分配一个构造函数,并且您必须安排从某个地方获取该构造函数。

您不能只创建TRow对象:该名称仅存在于编译时类型空间中,它在运行时不存在。某处你必须有一个具体的物品,你可以打电话。例如,您可以将它作为另一个参数添加到构造函数中:

export abstract class DataTableViewModel<TRow extends DataTableRowViewModel> { 
    public rowsViewModel: TRow[]; 
    public totalItemsCount: number; 

    constructor(rowObj: { new(dateService: DateService, rows?: any): TRow }, 
    dateService: DateService, rows?: { new(): any }[]) { 
     this.rowsViewModel = []; 
     if (rows) { 
      rows.forEach((row) => { 
       let obj = new rowObj(dateService, row); 
       this.rowsViewModel.push(obj); 
      }); 
     } 
    } 
} 
+0

谢谢,但如何使用它?作为第一个参数应该通过什么? – Igor

+0

您需要传递一些实现抽象类的具体类。 – Duncan

+0

感谢您的帮助,它的工作原理! – Igor

相关问题