typescript 如果角形2组件经过装饰,它们的类型是什么?

anauzrmj  于 2022-12-14  发布在  TypeScript
关注(0)|答案(2)|浏览(128)

我需要一张不同Angular 分量的Map。这是Map:

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

正如你所看到的,我有一个泛型类型MapOf,它是:

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

现在我很困惑< any >,因为很明显这是一个组件的Map,但是我不知道如何设置这个类型,我找不到答案。
ComponentRef不适合这里,因为它无论如何都要求引用。Type Component也不适合,因为我的组件是修饰的,它们包含一些'pure' Component上不存在的方法。
有什么想法吗?

y53ybaqx

y53ybaqx1#

装饰器不会改变类的类型。如果你只是想避免使用any类型,让每个组件类扩展相同的抽象类或实现相同的接口。然后你可以使用这个新类型作为泛型类型。例如,

class AddAttributeModalComponent implements MyInterface{...}

MapOf<MyInterface> = {...}

另一个可以尝试的方法是创建一个新的联合类型:

type MyNewType = AddAttributeModalComponent | 
                 EditAttributeModalComponent |
                 RequestUnitModalComponent |
                 RequestAttributeModalComponent;

MapOf<MyNewType> = {...};
2ekbmq32

2ekbmq322#

**简短回答:根本没有这种事
**详细答案:**我们通过使用@Component({...})装饰器提供一些关于Component的元数据来定义Component。Angular将使用这些元数据来创建View,这是我们过去所知道的Component的低级抽象。

因此,下面@Component装饰器的Component接口不是真实的的“组件类”:
import {Component} from '@angular/core';
为了实现你想要做的,我认为Yakov Fain's answer是非常正确的。你可以创建一个接口或者一个抽象类,然后从那里实现/扩展你的组件类。
如果你想了解更多关于视图的信息,Ng Wizard有一些关于这个主题的文章:

相关问题