首页 > 解决方案 > 在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是路径而不是模块数据本身。

有人有什么建议吗?

标签: javascript

解决方案


通常,对于这种类型的事情,我会使用类工厂:

import { Type } from 'some-module';

function createClass(parameters) {
  return class {
    ....
  }
}

const MyClass = createClass(...);

根据提供的详细信息,我不确定这是否适合您的特定用例。

编辑:作为旁注,据我所知,您不能从字符串构造模块,这是您的代码正在做的事情,也是编译器抱怨的事情。


推荐阅读