Создание общего типа T на базовом компоненте Angular 4 - PullRequest
0 голосов
/ 28 июня 2018

У меня есть супер компонент, который расширен некоторым дочерним компонентом:

 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 голосов
/ 28 июня 2018

Если 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)
    }
}
...