2017-10-19 28 views
0

J'ai une classe générique et j'ai besoin de créer une instance de avec quelques arguments. J'ai trouvé comment créer une instance avec un constructeur vide, mais quand j'essaye de la surcharger je reçois une erreur: 'ERROR TypeError: rowObj n'est pas un constructeur'Comment créer une instance de <T> avec des arguments en tapuscrit?

Voici l'ancien code qui fonctionne (mais avec un constructeur vide) :

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

Voici le nouveau code, je suis en train de faire le travail:

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

Qu'est-ce qu'un 'DataTableRowViewModel' et quelle est la signature de son constructeur? – jcalz

+0

@jcalz c'est juste une classe vide pour le moment, sans constructeur déclaré – Igor

Répondre

1

vous avez déclaré une rowObj variable, mais vous n'avez pas initialisées il. Vous devrez lui assigner un constructeur, et vous devrez arranger pour obtenir ce constructeur de quelque part.

Vous ne pouvez pas créer un objet TRow: ce nom n'existe que dans l'espace de type de compilation, il n'existe pas au moment de l'exécution. Quelque part vous devrez avoir un objet concret que vous pouvez appeler. Par exemple, vous pouvez l'ajouter comme un autre paramètre au constructeur:

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

Merci, mais comment l'utiliser après? Qu'est-ce qui devrait être adopté comme premier argument? – Igor

+0

Vous devez passer dans une classe concrète qui implémente votre classe abstraite. – Duncan

+0

Merci pour votre aide, ça marche! – Igor