我有一个名为Model
的类,它包含一个模式类,如“Person”,可以像这样成功实例化:
const people = new Model<Person>(Person, db);
数据库是数据库的抽象,允许模型与数据库进行交互而无需了解任何数据库详细信息...这可能与此问题无关,但我提出它看起来非常重要。< / p>
两次传递Person类的冗余很烦人,我想我可以创建一个名为 create()的Model
静态方法,如下所示: / p>
public static create(schema: new () => any, options: IModelOptions = {}) {
const schemaClass = new schema();
const db = options.db || Model.defaultDb;
const logger = options.logger || baseLogger;
const model = new Model<typeof schema>(schema, db, logger);
return model;
}
然后我可以简单地实例化:
const people = Model.create(Person, { db });
这几乎看起来很有效,但似乎在理解用于Model
的泛型类型时,Typescript有点不对劲。我吠叫错了树吗?有没有办法实现我想做的事情?如果是这样,我做错了什么?
提供更多关于 not 工作的细节......我发现传递的泛型类型信息为“T”:
export default class Model<T extends BaseSchema> { ... }
没有正确输入内容。因此,例如Model的许多公共接口将输入限制为类型<T>
,而不是将其作为“Person”,它被解析为Person的构造函数:new () => any
似乎根本不受约束。
答案 0 :(得分:2)
你也应该使create
通用,并让编译器根据构造函数返回类型推断实例类型,现在你基本上创建了你想要的Model<typeof Person>
Model<Person>
:
class Model<T> {
public constructor(schema: T) {}
public static create<T>(schema: new () => T) {
const schemaClass = new schema();
const model = new Model<T>(schemaClass);
return model;
}
}
class Person {}
let personModel = Model.create(Person) // will be Model<Person>