抽象类的子代的动态类型

问题描述 投票:0回答:1

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

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();

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

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

node.js typescript dynamic abstract-class
1个回答
0
投票

最简单的操作是不使用显式类型注释,让编译器推断对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

© www.soinside.com 2019 - 2024. All rights reserved.