在基本组件 Angular 4 上实例化通用类型 T

Instantiate generic Type T on base component Angular 4

我有一个由某些子组件扩展的超级组件 :

 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 }

但我不喜欢这个解决方案,不是干净安全的解决方案。

你找我有什么目的吗?

如果T是一个class并且你想实例化它,你需要将构造函数传递给class到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)
    }
}