我想将具有类型名称的字符串转换为没有显式映射的类型(我需要类型用于角度组件工厂)。
使用映射,这非常简单:
public readonly typeMap: Map<string, Type<{}>> = new Map<string, Type<{}>>([
['Type1', Type1],
['Type2', Type2]
]);
问题是我有许多需要手动映射的组件,如果我能够省略该映射,那就太好了。
我发现的解决方案由于缩小而无法实现:
使用eval()(同样会很脏而且不安全)
使用窗口['Type1']
我发现的其余解决方案大多是死线程,或者提供了映射的最佳可能性。您有任何解决方法的想法吗?这有可能吗?
答案 0 :(得分:1)
据我所见,没有很多限制是不可行的。 一个类的名称通常永远不会唯一。
映射是一种更加一致的解决方案,如果您不想手动映射所有内容,请编写一个预构建脚本来创建映射。使用Typescript反射API注释类也是一个很好的选择。
答案 1 :(得分:1)
因此,在@Julian的帮助下,我自己想出了一个不错的解决方案: 我用提供了类型字符串的类装饰器替换了映射,并注释了要使用它生成的每个类型。然后在装饰器实现中,将类型添加到地图中,该类型现在可以动态填充。
此解决方案无法绕过手动映射每个组件的问题,但我认为它比我以前的解决方案要好得多,因为映射现在与组件位于同一位置,并且不那么容易被遗忘。
// Empty mapping, filled at runtime
export const typeMap: Map<string, Type<{}>> = new Map<string, Type<{}>>();
// Classes that can be generated
@Type('Type1')
export class Type1 {}
@Type('Type2')
export class Type2 {}
// Decorator
export function Type(componentType: string) {
return (target) => { typeMap.set(componentType, <Type<{}>>target); };
}