2017-10-19 84 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

相關問題