首页 > 解决方案 > 如何在javascript中将代码作为字符串评估为类名?

问题描述

我正在尝试反序列化包含类名的 URL 参数,然后针对该类测试现有对象。

eval我以为我可以用这样的方式检索实际的课程

let type = eval(this.route.snapshot.queryParams['type']);
let id = +this.route.snapshot.queryParams['type'];

this.selectedResult = this.data.find(x => x.constructor === type && x.id === id);

但是eval抛出:

未捕获的 ReferenceError:未定义 MyClass

确实,当我在线下放置断点时eval,我的业务类没有定义。

我的猜测是导入并没有真正导入类,因为它仅用于在编译之前检查类型。

我能怎么做?

标签: javascriptangulartypescripteval

解决方案


您可以只检查构造函数名称:

x.constructor.name === this.route.snapshot.queryParams['type']

作为奖励,这对您的用户来说会减少安全风险(您的用户的浏览器不会评估可能已经在例如邮件中的链接中给出的随机字符串)。

在 URL 中传递未经过滤的代码引用仍然不是一个好主意:如果实际的类名发生变化怎么办?


推荐阅读