我正在尝试反序列化包含类名的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
线上设置断点时,我的业务类没有定义。
我的猜测是导入并没有真正导入类,因为它仅用于在编译之前检查类型。
我能怎么做?
你可以检查构造函数名称:
x.constructor.name === this.route.snapshot.queryParams['type']
作为奖励,这将降低您的用户的安全风险(您的用户的浏览器不会评估可能已在例如邮件中的链接中给出的随机字符串)。
在URL中传递未经过滤的代码引用仍然不是一个好主意:如果实际的类名改变了怎么办?