Какой тип угловых 2 компонентов, если они украшены? - PullRequest
0 голосов
/ 04 июля 2018

Мне нужно иметь карту различных угловых компонентов. Это карта:

  private modals: MapOf<any> = {
    addAttribute: AddAttributeModalComponent,
    editAttribute: EditAttributeModalComponent,
    requestUnit: RequestUnitModalComponent,
    requestAttribute: RequestAttributeModalComponent
  };

Как видите, у меня есть универсальный тип MapOf. Вот оно:

export interface MapOf<T> {
  [key: string]: T;
}

Прямо сейчас я запутался с , потому что это карта компонентов. Но я не знаю, как установить этот тип, и я не мог найти ответ.

ComponentRef здесь не помещается, потому что он все равно запрашивает ссылку. Компонент типа также не подходит, потому что мои компоненты декорированы и содержат некоторые методы, которых нет в «чистом» Компоненте.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Краткий ответ: такого не бывает.

Длинный ответ: Мы определяем Component, используя декоратор @Component({...}) для предоставления некоторых метаданных о Component. Angular будет использовать эти метаданные для создания View, который является низкоуровневой абстракцией Component, которую мы привыкли знать.

Итак, приведенный ниже интерфейс Component для декоратора @Component НЕ является реальным "классом компонентов":

import {Component} from '@angular/core';

Чтобы достичь того, что вы пытаетесь сделать, я думаю Яков Файн ответил совершенно правильно. Либо вы можете создать интерфейс или абстрактный класс, а затем реализовать / расширить ваши классы компонентов.

Если вы хотите узнать больше о представлении, есть несколько хороших статей от Ng Wizard на эту тему: https://blog.angularindepth.com/exploring-angular-dom-abstractions-80b3ebcfc02 https://blog.angularindepth.com/everything-you-need-to-know-about-change-detection-in-angular-8006c51d206f

0 голосов
/ 04 июля 2018

Декораторы не меняют тип класса. Если вы просто хотите избежать использования типа any, пусть каждый компонентный класс расширяет один и тот же абстрактный класс или реализует один и тот же интерфейс. Затем вы можете использовать этот новый тип как общий. Например,

class AddAttributeModalComponent implements MyInterface{...}

MapOf<MyInterface> = {...}

Другой вариант - создание нового типа объединения:

type MyNewType = AddAttributeModalComponent | 
                 EditAttributeModalComponent |
                 RequestUnitModalComponent |
                 RequestAttributeModalComponent;

MapOf<MyNewType> = {...};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...