Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在基本组件4上实例化泛型类型T_Angular_Typescript_Generics_Extends - Fatal编程技术网

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

Angular 在基本组件4上实例化泛型类型T,angular,typescript,generics,extends,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

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

 export class BaseComponent<T extends InternalItem> {

    private _internalGradientItems: T[];

    constructor(cdr: ChangeDetectorRef) {

    }

    protected addRow(item: Item) {
        // here I whant to instatiate the type T. 

    }
}
导出类基本组件{
私有_internalGradientItems:T[];
构造函数(cdr:ChangeDetectorRef){
}
受保护的addRow(项:项){
//这里我想说明T型。
}
}
出于某种原因,我需要在基本组件上实例化T元素。 我没有找到任何解决办法。 唯一需要考虑的工作是将对象投射到T

 let iItem = <T>{ gradientItem: item }
let iItem={gradientItem:item}
但我不喜欢这种溶液,它不是干净安全的溶液


你对我有什么目的吗

如果
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)
    }
}
导出类基本组件{
私有_internalGradientItems:T[];
构造函数(cdr:ChangeDetectorRef,public-ctor:new(arg:{gradientItem:Item})=>T){
}
受保护的addRow(项:项){
新的this.ctor({gradientItem:item});
}
}
//用法:
类内部项{/*基本属性*/}
类DerivedInternalItem扩展InternalItem{
/*道具*/
构造函数(参数:{gradientItem:Item}){
超级()
}
}
导出类DerivedComponent扩展BaseComponent{
构造函数(cdr:ChangeDetectorRef){
超级(cdr,衍生内部项目)
}
}

工作得非常完美,但我不确定这行“ctor:new(arg:{gradientItem:Item})=>T”@Yvan这是一个构造函数签名
ctor
将是一个构造函数(也称为使用
new
调用的函数),它接受指定类型的
arg
,并返回
T
的新实例