javascript - 在javascript中以编程方式创建类声明?
问题描述
最终我需要的是在运行时构建一个类声明,为属性注释提供动态参数:
import {Type} from "external-module";
export default class TypeWrapper {
@Type(() => '{this part of the class declaration should be changable at runtime}')
data
}
我有一种感觉,这应该可以实现,但还没有找到合适的方法。
作为概念证明,我试图做如下的事情:
let MyClass = eval('(class MyClass{})')
let myClass = new MyClass()
这行得通,但是MyClass
需要定义一些导入:
let MyClass = eval('import {Type} from "external-module"' +
'(class MyClass{})')
那个以“”失败,Cannot use import statement outside a module
这是意料之中的。
我尝试的另一种方法是从字符串加载模块:
var moduleData = '' +
'import module from "./module/path/file.js"\n' +
'\n' +
'export default class MyClass {\n' +
'}\n' +
'\n';
var b64moduleData = "data:text/javascript;base64," + btoa(moduleData);
let MyClass = await import(b64moduleData)
但它以“ Cannot find module
”失败,表明它假设b64moduleData
是路径而不是模块数据本身。
有人有什么建议吗?
解决方案
通常,对于这种类型的事情,我会使用类工厂:
import { Type } from 'some-module';
function createClass(parameters) {
return class {
....
}
}
const MyClass = createClass(...);
根据提供的详细信息,我不确定这是否适合您的特定用例。
编辑:作为旁注,据我所知,您不能从字符串构造模块,这是您的代码正在做的事情,也是编译器抱怨的事情。
推荐阅读
- c# - 在 C# 中获取没有管理员权限的进程路径
- java - java代码中的越界异常,需要帮助(初学者)
- tla+ - 指定活性,这样 TLA+ 中就不会发生循环
- android - ARCore 发布图片导致崩溃
- java - 在 android 中创建 ViewModel doubles 以使用 espresso 单独测试片段
- java - Assign unique ID for every new Class (not instance!)
- python - Numpy 根据两个数组给出的不同起始索引在两个轴上切片固定长度
- php - 在 null laravel 7 上调用成员函数 store()
- java - Hibernate - 如何在不使用惰性策略加载整个对象的情况下为多对多关系加载 id 集合
- javascript - 是否可以从另一个脚本中停止一个脚本?