如何在Angular 2 TS中将“String”值转换为“Type”

时间:2016-10-13 07:22:24

标签: angularjs angular typescript

这是我当前的对象,Home指的是我的导入

import { Home } from '../home/home';


  arr = [
      { name: "Home", root: "Home", icon: "calc" }
    ];

这就是我想要实现的目标:

 import { Home } from '../home/home';
 arr = [
          { name: "Home", root: Home, icon: "calc" }
        ];

我收到错误,因为“Home”是一个字符串。 eval()有效,但我正在寻找替代方案

工作代码:

 for (var i = 0; i < arr.length; i++) { 
      arr[i].root = eval(arr[i].root);
    }

1 个答案:

答案 0 :(得分:3)

这似乎是你的情况:
您正在从服务器接收json,该服务器在某些字段中具有您需要在运行时使用的类的名称 名称是字符串,您需要获取它们引用的类。

您确实可以使用eval,但请考虑建议避免使用eval,尤其是在从远程接收的数据上使用const REGISTRY = {} as { [name: string]: { new(): any }; ... class Home { ... } REGISTRY["Home"] = Home; 时,例如from MDN

  

eval()是一个危险的函数,它执行它传递的代码   具有来电者的特权。如果使用字符串运行eval()   可能会受到恶意方的影响,您最终可能会运行   具有您的权限的用户计算机上的恶意代码   网页/扩展程序。更重要的是,第三方代码可以看到   调用eval()的范围,可能导致可能的攻击   以类似函数不易受影响的方式。

如果您仍想使用它,那么继续,但另一种方法是拥有这些类的注册表:

for (var i = 0; i < arr.length; i++) { 
    arr[i].root = REGISTRY[arr[i].root];
}

然后:

{{1}}

另一件事是这种方法在服务器和客户端返回的数据之间建立耦合 您始终需要确保在json中返回的类名在客户端具有相应的实现 如果您在客户端重命名该类,您还需要记住在服务器上更改它 最好只返回数据然后让客户自己弄清楚如何行动和找到所需的类。