Указание типа переменной generi c в компоненте angular - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь создать общий c компонент, который может ожидать данные только двух типов:

interface X{
    name: string,
    path: string,
    type: string,
}

interface Y{
    name: string,
    path: string,
}

Оба типа X, Y имеют два общих свойства, а X имеет одно дополнительное. Теперь я определяю тип следующим образом:

export class MyComponent<T extends X | Y> implements OnInit{
    @Input() data: T[];
    func(item: T){
        let temp = this.data.find(x => x.name === item.name);
        <<....some code....>>
    }
}

Вызов этого из родительского компонента следующим образом:

<my-component [data]="xList"></my-component>     <!-- xList: X[] -->
<my-component [data]="yList"></my-component>     <!-- yList: y[] -->

Это работает нормально, но я не уверен, что это <T extends X | Y> правильный способ сделать это или нет. Кто-нибудь может предложить лучший подход здесь? Можем ли мы написать что-то вроде where T implements X | Y в Typescript?

Или я должен просто использовать @Input() data: any[];?

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Я думаю, что это нормально, но я бы сделал T extends Y только потому, что ключ type является дополнительным для X, и этот компонент сломался бы, если мы передадим ему вход массива типа Y, и компонент будет мешать с type ключ.

0 голосов
/ 20 февраля 2020

Я не думаю, что фреймворк Angular будет знать обобщенный аргумент T c при создании экземпляра MyComponent. единственное, о чем я могу подумать, - это получить экземпляр компонента во время выполнения и попытаться самостоятельно установить тип generi c, который будет создавать любые различия, поскольку MyComponent уже будет создан, а @Input() data будет установлен. .

Я думаю, вы должны просто написать @Input() data: X[] | Y[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...