如果装饰了角度2组件,它们的类型是什么?

时间:2018-07-04 09:46:28

标签: angular typescript interface

我需要一张不同角度分量的图。这是地图:

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

如您所见,我有一个通用类型MapOf。就是这样:

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

现在我对感到困惑,因为显然这是组件图。但是我不知道如何设置此类型,也找不到答案。

ComponentRef不适合此处,因为它仍然要求提供引用。 类型Component也不合适,因为我的组件已经过装饰,并且包含一些“纯”组件上不存在的方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

装饰器不会更改类的类型。如果只想避免使用类型any,请让每个组件类扩展相同的抽象类或实现相同的接口。然后,您可以将此新类型用作通用类型。例如,

class AddAttributeModalComponent implements MyInterface{...}

MapOf<MyInterface> = {...}

尝试的另一种选择是创建一个新的联合类型:

type MyNewType = AddAttributeModalComponent | 
                 EditAttributeModalComponent |
                 RequestUnitModalComponent |
                 RequestAttributeModalComponent;

MapOf<MyNewType> = {...};

答案 1 :(得分:1)

简短的回答:没有这样的事情。

长答案::我们使用Component装饰器定义@Component({...}),以提供有关Component的一些元数据。 Angular将使用该元数据来创建View,这是我们以前知道的Component的底层抽象。

因此,Component装饰器下面的@Component接口不是真正的“组件类”:

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

要实现您想要的目标,我认为EXISTS keyword click here是正确的。您可以创建一个接口或一个抽象类,然后从那里实现/扩展您的组件类。

如果您想了解更多有关该视图的信息,请参阅Ng Wizard撰写的有关该主题的一些不错的文章: Yakov Fain's answer  https://blog.angularindepth.com/exploring-angular-dom-abstractions-80b3ebcfc02