const Namespace = { "FooFunction": () => { class MyError extends Error { constructor(message) { super(message); } } return {"MyError": MyError}; } } console.log((new (Namespace.FooFunction()).MyError("foo")) instanceof Namespace.FooFunction().MyError);Esto imprime falso. Estoy buscando una forma de usar instancia de contra un "tipo almacenado en una variable" como este. ¿Cómo puedo hacer esto? ¿Es posible?
Cada vez que llama a Namespace.FooFunction , crea una nueva clase MyError , por lo que Namespace.FooFunction().MyError == Namespace.FooFunction().MyError nunca será verdadero.
Si necesita mantener la declaración de la clase MyError dentro de la función tal como la tiene, cambiando lo menos posible, podemos convertir FooFunction en un IIFE, lo que le permite devolver la misma clase MyError en cada llamada:
const Namespace = { "FooFunction": (() => { class MyError extends Error { constructor(message) { super(message); } } return (...arguments) => ({"MyError": MyError}); })() } console.log((new (Namespace.FooFunction()).MyError("foo")) instanceof Namespace.FooFunction().MyError); Por supuesto, una mejor opción sería agregar la clase al propio objeto Namespace :
const Namespace = { "MyError": class MyError extends Error { constructor(message) { super(message); } }, "FooFunction": function() { return {"MyError": this.MyError}; } } console.log((new (Namespace.FooFunction()).MyError("foo")) instanceof Namespace.FooFunction().MyError);