Eventualmente, lo que necesito es crear una declaración de clase en tiempo de ejecución que proporcione parámetros dinámicos a una anotación de propiedad:
import {Type} from "external-module"; export default class TypeWrapper { @Type(() => '{this part of the class declaration should be changable at runtime}') data }Tengo la sensación de que esto debería ser posible de lograr, pero todavía no puedo encontrar la manera adecuada.
Como prueba de concepto, estaba tratando de hacer algo como lo siguiente:
let MyClass = eval('(class MyClass{})') let myClass = new MyClass() Eso funciona, sin embargo, MyClass necesita definir algunas importaciones:
let MyClass = eval('import {Type} from "external-module"' + '(class MyClass{})') Ese falla con " Cannot use import statement outside a module ", lo cual es bastante esperado.
Otro enfoque que probé es cargar un módulo desde una cadena:
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) Pero falla con " Cannot find module ", lo que sugiere que asume que b64moduleData es una ruta en lugar de los datos del módulo en sí.
¿Alguien tiene alguna sugerencia?
Normalmente, para este tipo de cosas usaría una fábrica de clases:
import { Type } from 'some-module'; function createClass(parameters) { return class { .... } } const MyClass = createClass(...);No estoy seguro de si esto se ajusta a su caso de uso particular según los detalles proporcionados.
EDITAR: Como nota al margen, hasta donde yo sé, no puede construir módulos a partir de una cadena, que es lo que está haciendo su código y de lo que se queja el compilador.