强制转换类型名称以键入打字稿

时间:2018-10-16 15:11:11

标签: angular typescript

我想将具有类型名称的字符串转换为没有显式映射的类型(我需要类型用于角度组件工厂)。

使用映射,这非常简单:

public readonly typeMap: Map<string, Type<{}>> = new Map<string, Type<{}>>([
  ['Type1', Type1],
  ['Type2', Type2]
]);

问题是我有许多需要手动映射的组件,如果我能够省略该映射,那就太好了。

我发现的解决方案由于缩小而无法实现:

  • 使用eval()(同样会很脏而且不安全)

  • 使用窗口['Type1']

我发现的其余解决方案大多是死线程,或者提供了映射的最佳可能性。您有任何解决方法的想法吗?这有可能吗?

2 个答案:

答案 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); };
}
相关问题