动态分类抽象类的孩子

时间:2019-12-16 14:28:11

标签: node.js typescript dynamic abstract-class

我有一个静态定义的抽象类,并动态检索了它的实现 即

export abstract class Foo {
   abstract get();
}

const dynamicClass: typeof Foo = ( function() {
    return class Bar {
        get: function() {
            console.log('get');
        }

       constructor() {
         super();
         console.log('cons');
       }
    }
}();

这很正常,只有一件事:没有“作弊”,我就不能调用构造函数 IE浏览器 new Bar()的输出无法实例化抽象类 我已经通过这样做解决了

// @ts-ignore new Bar();

但是我觉得我可以做得更好。

整个用例是,在运行时创建类的功能将根据其所使用的系统而有所不同(动态加载为简单起见而删除的额外库)

1 个答案:

答案 0 :(得分:1)

最简单的方法是不使用显式类型注释,让编译器推断对dynamicClass的处理方式:

export abstract class Foo {
   abstract get(): void;
}

const dynamicClass = (function() {
    return class Bar extends Foo {
        get() {
            console.log('get');
        }

       constructor() {
         super();
         console.log('cons');
       }
    }
})();

new dynamicClass();

Playground Link

如果您想走显式路线,可以使用返回Foo的构造函数签名,这应该可以消除构造函数的荒诞性:

export abstract class Foo {
   abstract get(): void;
}

const dynamicClass: new () => Foo = (function() {
    return class Bar extends Foo {
        get() {
            console.log('get');
        }

       constructor() {
         super();
         console.log('cons');
       }
    }
})();

new dynamicClass();

Playground Link