Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics TypeScript中静态方法的抽象方法版本_Generics_Inheritance_Typescript_Abstract Class - Fatal编程技术网

Generics TypeScript中静态方法的抽象方法版本

Generics TypeScript中静态方法的抽象方法版本,generics,inheritance,typescript,abstract-class,Generics,Inheritance,Typescript,Abstract Class,我正在用typescript创建一个数据模型范例。我在不同的地方存储不同类型的数据(SQL,本地缓存)。我想创建一个抽象类,它包含任何类型的数据存储(创建、查找、更新、计数、销毁)所需的所有方法。通过这种方式,我可以扩展该类,并针对不同类型的存储以不同的方式实现它,如果我缺少一个方法,编译器会警告我。然后,我将在一个描述数据模型的类中扩展其中一个实现。但是,我需要的一些方法(如find和create)是静态的。我知道typescript不支持抽象静态方法。我是否可以使用类似于抽象方法的方法,以便

我正在用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对象,然后使用接口或抽象类键入该通用对象,该接口或抽象类具有每个对象所需的方法。你认为这是一个好方法吗?
你认为这是一个好方法吗
如果有效,那么是的