这是我当前的对象,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);
}
答案 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中返回的类名在客户端具有相应的实现 如果您在客户端重命名该类,您还需要记住在服务器上更改它 最好只返回数据然后让客户自己弄清楚如何行动和找到所需的类。