【发布时间】:2018-04-04 06:36:02
【问题描述】:
是否可以在 Angular 4 中声明具有泛型类型的组件?
以下代码导致构建错误:
export class MyGenericComponent<T> implements OnInit {
@Input() data: BehaviorSubject<T[]>;
//...
}
执行ng serve时的错误是:
ERROR in C:/.../my-generic.module.ts (5,10): Module '"C:/.../my-generic.component"' has no exported member 'MyGenericComponent'.
示例:
以下示例尝试实现一个通用数据表,其中@Input() data 从一个“调用此组件”的组件更改为另一个。
问题是BehaviorSubject<any[]> 是否可以更改为BehaviorSubject<T[]>,其中T 将是传递给组件的泛型类型?
@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() {}
}
【问题讨论】:
-
框架如何知道组件的通用参数应该是什么?
-
你想用这个解决什么问题?
-
@jonrsharpe 我正在尝试实现一个列出数据的通用组件。数据模型的类型可能会根据使用此组件的页面而改变。我编辑了我的问题,以举例说明我在类中使用泛型类型的位置
-
@jonrsharpe 您的意思是使用通用组件是一个糟糕的概念?从技术上讲,我可以使用类型 any 而不是 generic 类型,但这是一个好习惯吗?
-
目前还不清楚您要达到的目标,因此上面的评论。如果没有上下文,例如您想抽象出两个具体的
Ts 的示例,这可能是一个 XY 问题(参见例如 xyproblem.info)。
标签: angular typescript angular-components typescript-generics