如何转换" String"价值为"类型"在Angular 2

时间:2016-02-12 07:26:14

标签: typescript angular ionic2

我想在ionic 2应用程序中创建一个侧边菜单,其中页面导航组件放在一个外部json文件中,该文件是在menuService.getMenu函数的帮助下获取的。

MY JSON结构:

"menu":[
        {
          "title":"Grid",
          "component":"GridPage"
        }
      ]

我的Ts:

    this.menuService.getMenu().then((menu) => {
    this.menu = menu;
    });

    openPage(menu) {
      console.log("menu", menu.component);
      nav.setRoot(menu.component);
    }

控制台日志打印字符串GridPage。我尝试使用Type作为Type(menu.component)进行转换。但我在控制台中的结果是一个具有匿名名称的函数。有人请帮助我将json字符串转换为组件" Type"导航工作。

2 个答案:

答案 0 :(得分:10)

我想有一种方法可以通过字符串获取类的类型,但我不知道(我不使用TS)。

是一个简单的解决方法

创建从字符串到类型

的地图
classes = {
  'MyClass1': MyClass1,
  'MyClass2': MyClass2,
  'Grid': Grid
}

然后只查看类型

class['Grid']

缺点是你需要提前知道所有支持的类。

答案 1 :(得分:4)

我不深入了解Angular 2,但在结构良好的应用程序中,使用字符串获取Type非常简单明了,如果您知道给定类型的完全限定名称:

let typeName = "GridPage";
let ComponentType = MyApp.Components[typeName];

如果您收到以下类型错误:

  

对象类型的索引签名隐式具有“任何”类型。

...然后你需要输入前面的命名空间(对象)。在这种情况下,我更喜欢断言为any,因为它比为基于字符串的索引签名定义内联接口要短,并且您实际上不会丢失任何类型安全性:

let ComponentType = (MyApp.Components as any)[typeName];

此外,这种方法也适用于模块:

import * as Components from "./components";

let ComponentType = (Components as any)[typeName];