Generics TypeScript中静态方法的抽象方法版本
我正在用typescript创建一个数据模型范例。我在不同的地方存储不同类型的数据(SQL,本地缓存)。我想创建一个抽象类,它包含任何类型的数据存储(创建、查找、更新、计数、销毁)所需的所有方法。通过这种方式,我可以扩展该类,并针对不同类型的存储以不同的方式实现它,如果我缺少一个方法,编译器会警告我。然后,我将在一个描述数据模型的类中扩展其中一个实现。但是,我需要的一些方法(如find和create)是静态的。我知道typescript不支持抽象静态方法。我是否可以使用类似于抽象方法的方法,以便编译器警告我缺少方法 我还希望这些静态方法是泛型的,并且类型与类相同。我知道这对于标准泛型类来说毫无意义。但是,由于这个类总是被扩展的,并且从来没有被实例化过,我可以在扩展它时键入泛型类,自动更新静态方法上的泛型类型吗 我是否可以使用类似于抽象方法的方法,以便编译器警告我缺少方法 不是内置的,因此您不会通过简单的Generics TypeScript中静态方法的抽象方法版本,generics,inheritance,typescript,abstract-class,Generics,Inheritance,Typescript,Abstract Class,我正在用typescript创建一个数据模型范例。我在不同的地方存储不同类型的数据(SQL,本地缓存)。我想创建一个抽象类,它包含任何类型的数据存储(创建、查找、更新、计数、销毁)所需的所有方法。通过这种方式,我可以扩展该类,并针对不同类型的存储以不同的方式实现它,如果我缺少一个方法,编译器会警告我。然后,我将在一个描述数据模型的类中扩展其中一个实现。但是,我需要的一些方法(如find和create)是静态的。我知道typescript不支持抽象静态方法。我是否可以使用类似于抽象方法的方法,以便
// WILL NOT COMPILE. SAMPLE
class Foo {
abstract static X() { }
}
class Bar extends Foo { // Error here please
}
但是,您可以使用诸如类型兼容性之类的技巧来确保:
interface FooAbstract {
X(): any;
}
let _ensureAbstractMatch: FooAbstract;
class Foo {
}
class Bar extends Foo {
}
_ensureAbstractMatch = Bar; // Error missing method
示例实现:
interface FooAbstract {
X(): any;
}
let _ensureAbstractMatch: FooAbstract;
class Foo {
}
class Bar extends Foo {
static X() { }
}
_ensureAbstractMatch = Bar; // OKAY
我知道typescript不支持抽象静态方法。是否有类似于[静态]抽象方法的东西我可以使用
研究抽象静力学。答案是抽象静态
声明是,但您可以做一些接近的事情:要求类对象实现抽象类,这相当于说它的静态必须实现接口。举例来说,我从其他几个答案中学到了一些部分:
//静态接口。
抽象类ResourceContainer{
抽象创建(资源:创建者):资源
摘要计数(查询?:查询):数字
摘要查找(查询:query):FindResult
}
//实例接口。
抽象类资源{
abstract read():ReadResult
摘要更新(资源:updater):ReadResult
抽象删除():void
}
//将newable附加到对应于具体类的类型-因为Typescript。。。
键入NewableResource=({new(…args:any):any}&ResourceContainer)
const FooResource:NewableResource=类扩展资源{
静态创建(资源:Creator):资源{console.debug('create');返回新的this();}
静态查找(查询?:查询){console.debug('find');}
静态计数(查询?:查询){console.debug('count');返回0;}
read(){console.debug('read');}
更新(资源:updater){console.debug('update');}
delete(){console.debug('delete');}
}
//TODO:充实这些实用程序类型。。
类型查询=未知;
类型FindResult=未知;
类型ReadResult=未知;
类型更新程序=未知;
类型创建者=未知;
//获取类对象*值*的*类型*。
类型FooResource=InstanceType
const x:foorResource=foorResource.create({});
x、 读()
或者,如果您愿意,您可以这样做:
抽象类资源{
静态创建(资源:创建者):资源{throw NotImplementedError()}
静态计数(查询?:查询):数字{throw NotImplementedError()}
静态查找(query:query):FindResult{throw NotImplementedError()}
abstract read():ReadResult
摘要更新(资源:updater):ReadResult
抽象删除():void
}
我认为使用singleton模式可能更简单,用方法代替静态方法创建通用singleton对象,然后使用接口或抽象类键入该通用对象,该接口或抽象类具有每个对象所需的方法。你认为这是一个好方法吗?你认为这是一个好方法吗
如果有效,那么是的