抽象子项的动态类型 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();
如果你想走显式路线,你可以使用 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();
我有一个静态定义的抽象 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();
如果你想走显式路线,你可以使用 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();