在基础组件Angular 4上实例化通用Type T

时间:2018-06-28 07:23:01

标签: angular typescript generics extends

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

 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 }

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

你对我有目的吗?

1 个答案:

答案 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)
    }
}