我有一个超级组件,该组件由某些子组件扩展:
export class BaseComponent<T extends InternalItem> {
private _internalGradientItems: T[];
constructor(cdr: ChangeDetectorRef) {
}
protected addRow(item: Item) {
// here I whant to instatiate the type T.
}
}
由于某种原因,我需要在基础组件上实例化T元素。 我没有找到解决方案。 唯一想到的工作是将对象投射到T。
let iItem = <T>{ gradientItem: item }
但是我不喜欢这种解决方案,不是干净安全的解决方案。
你对我有目的吗?
答案 0 :(得分:1)
如果T
是一个类,并且要实例化它,则需要将构造函数传递给BaseComponent
的类。您既可以使用空构造函数,也可以使用采用BaseComponent
传递的属性的构造函数。
export class BaseComponent<T extends InternalItem> {
private _internalGradientItems: T[];
constructor(cdr: ChangeDetectorRef,public ctor: new (arg: { gradientItem: Item })=> T) {
}
protected addRow(item: Item) {
new this.ctor({ gradientItem: item });
}
}
//Usage:
class InternalItem { /* base props */ }
class DerivedInternalItem extends InternalItem {
/* props */
constructor(arg: { gradientItem: Item }) {
super()
}
}
export class DerivedComponent extends BaseComponent<DerivedInternalItem> {
constructor(cdr: ChangeDetectorRef) {
super(cdr, DerivedInternalItem)
}
}