Déclarer un composant de type générique

Est-il possible de déclarer un composant avec un type générique dans Angulaire 4?

Le code suivant provoque les erreurs de compilation:

export class MyGenericComponent<T> implements OnInit {
    @Input()  data: BehaviorSubject<T[]>;

    //...
}

L'erreur lors de l'exécution de ng serve est:

ERROR in C:/.../my-generic.module.ts (5,10): Module '"C:/.../my-generic.component"' has no exported member 'MyGenericComponent'.

Exemple:

L'exemple suivant est une tentative de mettre en œuvre un générique tableau de données où @Input() data les changements d'un composant " l'appel de cette composante à l'autre.
La question est peut BehaviorSubject<any[]> être changé à BehaviorSubject<T[]>T serait le type générique passés au composant?

@Component({
  selector: 'my-data-list',
  templateUrl: './data-list.component.html',
  styleUrls: ['./data-list.component.css']
})
export class DataListComponent implements OnInit {
  @Input()  data: BehaviorSubject<any[]>;
  @Output() onLoaded = new EventEmitter<boolean>();

  private tableDataBase : TableDataBase = new TableDataBase();
  private dataSource : TableDataSource | null;

  constructor() { }

  ngOnInit() {
    this.tableDataBase.dataChange = this.data;
    this.dataSource = new TableDataSource(this.tableDataBase);
    this.onLoaded.emit(true);
  }
}

class TableDataBase {
  dataChange: BehaviorSubject<any[]> = new BehaviorSubject<any[]>([]);

  get data(): any[] {
    return this.dataChange.value;
  }
}

class TableDataSource extends DataSource<any> {

  constructor(private tableDataBase: TableDataBase) {
    super();
  }

  connect(): Observable<any[]> {
    return Observable.of(this.tableDataBase.data);
  }

  disconnect() {}
}
  • Comment le cadre de savoir ce que l'argument générique devrait être pour le composant?
  • Quel est le problème que vous essayez de résoudre ce problème?
  • Je suis en train de mettre en œuvre un composant générique que les listes de données. Le type de modèle de données peut changer en fonction de la page à l'aide de ce composant. J'ai édité ma question pour donner un exemple, là où je suis en utilisant le type générique de la classe
  • Je comprends l'idée d'une classe générique, mais comment un composant de faire cela? Sûrement les liaisons seront différentes pour chaque T? Bien sûr, vous pouvez extraire des méthodes communes pour une super-classe, mais au-delà, il est difficile de savoir ce que vous attendez.
  • Tu veux dire que c'est un mauvais concept de travailler avec des composants génériques? Techniquement, j'ai pu travailler avec le type de tout à la place d'un type générique, mais serait-ce une bonne pratique?
  • Ce n'est pas vraiment clair ce que vous essayez d'atteindre, d'où le commentaire ci-dessus. Sans le contexte, comme un exemple de deux le béton Ts que vous souhaitez à l'abstrait, c'est probablement un XY problème (voir par exemple xyproblem.info).
  • J'ai juste ajouté un exemple dans mon post, j'espère qu'elle pourra aider

InformationsquelleAutor Strider | 2017-10-23