如何将代码作为字符串评估为 javascript 中的 class 名称?

How to eval code as string to class name in javascript?

我正在尝试反序列化包含 class 名称的 URL 参数,然后针对该 class.

测试现有对象

我想我可以用这样的 eval 检索实际的 class

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 抛出:

Uncaught ReferenceError: MyClass is not defined

确实,当我在eval行下断点时,我的业务class没有定义。

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

我该怎么办?

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

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

作为奖励,这会降低您用户的安全风险(您用户的浏览器不会计算随机字符串,该字符串可能已经在例如 link 邮件中给出)。

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