javascript - 抽象类中的 Typescript 静态方法来创建 self 的实例
问题描述
假设我有
abstract class Foo {
}
class Bar1 extends Foo {
constructor(someVar) { ... }
}
class Bar2 extends Foo {
constructor(someVar) { ... }
}
我希望能够创建一个静态方法来创建最终类的实例(所有构造函数都具有相同的签名)。所以我想要类似的东西:
abstract class Foo {
public static someAction(someVar) {
const self = new this(someVar);
}
}
但这无法做到,因为Foo
它是抽象的。这是可能吗?
更新
如果这些类有自己的模板怎么办?
abstract class Foo<M> {
}
class Bar1 extends Foo<SomeModel> {...}
现在我想someAction
知道 type SomeModel
。我试过
public static someAction<A, T extends Foo<A>>(this: new (someVar: any) => T, someVar: any): T {
const self = new this(someVar);
return self;
}
但是除非我专门做Bar1.someAction<SomeModel>("blah")
返回的结果是不可用的数据类型,即Bar1.someAction("blah")
不知道数据类型
解决方案
this
您可以为静态方法的类型添加注释。在这种情况下this
将引用类,并为this
参数添加注释将使静态方法仅在满足约束的类上可见(在这种情况下,存在具有单个参数的构造函数),它还将帮助我们提取调用该方法的类的实际实例类型:
abstract class Foo {
public static someAction<T extends Foo>(this: new (someVar: any) => T, someVar: any): T {
const self = new this(someVar);
return self;
}
}
class Bar1 extends Foo {
constructor(someVar: any) {
super();
}
}
class Bar2 extends Foo {
constructor(someVar: any) {
super();
}
}
let bar1 = Bar1.someAction(0) // of type Bar1
let bar2 = Bar2.someAction(0) // of type Bar2
推荐阅读
- linux - 每次用户解锁屏幕时运行 bash 脚本
- python - 如何在 Scrapy 中按所需顺序或同步爬行?
- python - 创建列表只能将str(不是“int”)连接到str
- typescript - 打字稿多泛型对象声明
- node.js - 无法将文件上传到 MongoDb
- c# - 无法将 Auto Mapper 与 .net core 2.2 一起使用
- python - 增强学习的gk bot中的Keras高损失和高精度?
- javascript - Bootstrap 下拉菜单与可点击父容器内的其他按钮
- php - 为什么0.32乘法时会四舍五入为1
- c# - 在 SSIS 脚本任务静态构造函数中访问可配置值