如何在Angular 2中将"String"值转换为"Type"

Ais*_*App 7 typescript ionic2 angular

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

MY JSON结构:

"menu":[
        {
          "title":"Grid",
          "component":"GridPage"
        }
      ]
Run Code Online (Sandbox Code Playgroud)

我的Ts:

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

    openPage(menu) {
      console.log("menu", menu.component);
      nav.setRoot(menu.component);
    }
Run Code Online (Sandbox Code Playgroud)

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

Gün*_*uer 10

我想有一种方法可以通过字符串获取类的类型,但我不知道(我不使用TS).一个简单的解决方法是

从字符串到类型创建一个映射

classes = {
  'MyClass1': MyClass1,
  'MyClass2': MyClass2,
  'Grid': Grid
}
Run Code Online (Sandbox Code Playgroud)

然后只看一下类型

class['Grid']
Run Code Online (Sandbox Code Playgroud)

缺点是您需要提前知道所有支持的类.


Joh*_*isz 5

我不了解Angular 2的深入知识,但是在结构良好的应用程序中,如果您知道给定Type的完全限定名称,使用字符串来获取Type是直接且可行的:

let typeName = "GridPage";
let ComponentType = MyApp.Components[typeName];
Run Code Online (Sandbox Code Playgroud)

如果出现以下类型错误:

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

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

let ComponentType = (MyApp.Components as any)[typeName];
Run Code Online (Sandbox Code Playgroud)

此外,此方法还可以与模块完美配合:

import * as Components from "./components";

let ComponentType = (Components as any)[typeName];
Run Code Online (Sandbox Code Playgroud)