typescript - 抽象类实现的 Typescript 类型声明
问题描述
我试图弄清楚如何提供与“实现某个抽象类的所有类”相对应的类型定义。以下面的代码示例为例:
abstract class AbstractFoo {
abstract foo()
}
class Concrete1 extends AbstractFoo {
foo() { ... }
}
class Concrete1 extends AbstractFoo {
foo() { ... }
}
现在,我正在尝试创建一个从string
一个具体类到其中一个的映射。请注意,我并不是要映射到具体类的实例中。请参阅以下内容:
const myMap: Map<string, typeINeedHelpWith> = new Map()
myMap.set('concrete1string', Concrete1)
myMap.set('concrete2string', Concrete2)
const instantiatedConcrete1 = new myMap.get('concrete1string')(...)
是否有一个类型定义typeINeedHelpWith
可以让我完成这个?
解决方案
使用将具体实例作为映射值返回的函数。
更新:以下建议仅对deno有效
作为建议,最好使用Record
类型而不是 a Map
,否则错误的键 ( mymap.get("concrete3")()
) 将被视为运行时异常。
abstract class AbstractFoo {
abstract foo(): number;
}
class Concrete1 extends AbstractFoo {
foo() {
return 1;
}
}
class Concrete2 extends AbstractFoo {
foo() {
return 2;
}
}
const myMap: Record<string, () => AbstractFoo> = {
"concrete1": () => new Concrete1(),
"concrete2": () => new Concrete2(),
};
const instantiatedConcrete1 = myMap.concrete1();
let fooResult = instantiatedConcrete1.foo();
如评论中所述,请注意我使用了工厂模式来创建对象。
这被认为是一种很好的设计模式,但当不需要时,更简单的基于构造函数的解决方案可能更合适:
const myRec: Record<string, new() => AbstractFoo> = {
"concrete1": Concrete1,
"concrete2": Concrete2,
};
const iConcrete1 = new myRec.concrete1();
sintaxnew() => AbstractFoo
定义了构造函数的签名,该构造函数不带参数并返回具有 shape 的对象AbstractFoo
。
推荐阅读
- azure - 我们可以使用全局参数来创建 ADLS/DataBricks 链接服务吗
- c - __get_vm_area_node 中出现 BUG_ON 的原因是什么?
- r - ggplot中面板之间的边距
- c++ - 你如何访问其他类的功能?
- laravel - How can updating children components in table using livewire?
- excel - 使用excel VBA查找每列中最后使用的行数
- javascript - 数据表不显示数据
- sql - 如何将GETDATE(仅日期)作为sql server中的参数传递?
- django - Django - 加载转储后仅迁移新迁移
- python - 如何使用 selenium python 通过文本单击 css 选择器