我正在尝试使用 TypeScript 为 node.js 和 MongoDB 构建一个类似于“实体框架”的 ORM 库。
使用这个库,消费者将能够定义一个Person
扩展Base
类的模型类(例如),并且类装饰器将向 Person 类添加额外的数据(例如,instances
数组,它将包含模型的所有实例,collection_name
这将是模型的 MongoDB 集合名称等)。
TypeScript 游乐场中的代码。
所以我的第一步是创建一个Base
类:
class Base<T>
{
static collection_name: string
static instances: Base<any>[]
_id: string
}
所以用户将能够像这样定义他的模型:
@decorator<Person>({collection_name: 'people'})
class Person extends Base<Person>
{
@field name
@field address
...
}
然后我创建了一个装饰器类来设置Person 类的collection_name
和属性:instances
function decorator<T>(config: { collection_name: string }) {
return function <T extends Base<T>>(Class: IClass<T>) {
Class.collection_name = config.collection_name;
Class.instances = [];
return Class
}
}
装饰器函数接收用户生成的Class
,我正在尝试创建一个接口来描述此类的类型。我叫它IClass
:
interface IClass<T>
{
new(): Base<T>
instances: Base<T>[];
collection_name: string
}
new
是构造函数(返回一个Base
实例)instances
并且collection_name
是静态属性Base<T>
并且在这里是非静态的(我不确定,对吗?)
但是,在尝试定义用户模型时,出现以下错误:
@decorator<Person>({collection_name: 'people'}) // <==== ERROR HERE ===
class Person extends Base<Person>
{
}
错误:(23, 2) TS2345:“typeof Person”类型的参数不可分配给“IClass>”类型的参数。
“typeof Person”类型中缺少属性“instances”,但“typeof Person”类型缺少“IClass>”类型中所需类型的以下属性。
似乎打字稿编译器Base
在检查typeof Person
.
如何定义装饰器函数的 Class 属性的类型?