抽象子项的动态类型 class

Dynamic typing of child of abstract class

我有一个静态定义的抽象 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');
       }
    }
}();

除一件事外一切正常:没有 "cheating" 我无法调用构造函数 IE new Bar() 输出无法实例化抽象 class 我已经通过

解决了这个问题

// @ts-ignore new Bar();

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

整个用例是,在运行时创建 class 的函数将根据它所在的系统采取不同的行为(动态加载我为简单起见删除的额外库)

你能做的最简单的事情就是不使用显式类型注释,让编译器推断它会为 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

如果你想走显式路线,你可以使用 returns 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