使用类作为构造函数和类型

时间:2018-04-04 01:26:21

标签: typescript

我有一个名为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似乎根本不受约束。

1 个答案:

答案 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>