Angular 将typename强制转换为键入typescript

Angular 将typename强制转换为键入typescript,angular,typescript,Angular,Typescript,我想将一个带有typename的字符串转换为一个没有显式映射的类型(我需要一个角度组件工厂的类型) 使用映射,这非常简单: 公共只读类型映射:映射=新映射([ ['Type1',Type1], ['Type2',Type2] ]); 问题是,我有许多组件需要手动映射,如果我能够省略映射就好了 我发现的解决方案,由于规模缩小,很遗憾不可能实现: 使用eval() 使用窗口['Type1'] 我发现的其余解决方案大多是死线程,或者提供了最佳的映射。你有什么办法解决这个问题吗?这可能吗?从我所看

我想将一个带有typename的字符串转换为一个没有显式映射的类型(我需要一个角度组件工厂的类型)

使用映射,这非常简单:

公共只读类型映射:映射=新映射([
['Type1',Type1],
['Type2',Type2]
]);
问题是,我有许多组件需要手动映射,如果我能够省略映射就好了

我发现的解决方案,由于规模缩小,很遗憾不可能实现:

  • 使用eval()

  • 使用窗口['Type1']


我发现的其余解决方案大多是死线程,或者提供了最佳的映射。你有什么办法解决这个问题吗?这可能吗?

从我所看到的来看,如果没有很多限制,这是不可行的。 类的名称通常都不是唯一的


映射是一个更加一致的解决方案,如果您不想手动映射所有内容,那么就编写一个预构建脚本来创建映射。使用Typescript反射API注释类也是一个很好的选择

多亏@Julian的帮助,我自己想出了一个很好的解决方案: 我用一个类装饰器替换了映射,该类装饰器被赋予类型字符串并注释了我想用它生成的每个类型。在decorator实现中,我随后将类型添加到映射中,该映射现在是动态填充的

这个解决方案并没有绕过手动映射每个组件,但我认为它比我以前的解决方案要好得多,因为映射现在与组件位于同一位置,并且不容易被忘记

//空映射,在运行时填充
导出常量typeMap:Map=newmap();
//可以生成的类
@类型('Type1')
导出类类型1{}
@类型('Type2')
导出类类型2{}
//装饰师
导出函数类型(componentType:string){
return(target)=>{typeMap.set(componentType,target);};
}

可能是这样的:
['Type1',Type1]
@miselking这会有什么改进?我还是要手动设置类型……@你愿意考虑一个基于装饰的方法吗?这张地图将由装饰师保管。您需要显式地向每个类添加decorator,以便drawback@TitianCernicova-德拉戈米尔,这也不会真正帮助我,因为我只需要在一个类的地图。。。我想完全避免它。@如果缩小删除了类名,那么您必须以其他方式捕获类名关系谢谢,您注释类的提示确实帮助了我,尽管我没有使用反射。我将在下面发布我的解决方案,但如果很快没有更好的答案,赏金是你的:)@David已经用universal和AOT编译对其进行了测试,因为这是我在项目中使用的。。。至少对我来说,这似乎有效。当服务器启动时,地图会被填满,我想甚至在Angular应用程序启动之前。哦,好的,很高兴知道。不久前我尝试过使用自定义装饰器,但在AOT中效果不太好。以下是一个相关的github问题供参考: