返回构造函数的工厂方法的键入

时间:2018-08-04 10:25:13

标签: typescript

我有{{3}}用JS编写的。该库具有返回构造函数的工厂方法db.model()。看起来是这样的:

var person = db.model({table: 'people'});

var bob = person({name: 'bob'});

bob.save()

使用new创建对象(未记录,但也可以)(不知道它是否安全,但通过了我的所有测试):

var Person = db.model({table: 'people'});

var bob = new Person({name: 'bob'});

bob.save()

此外,返回的构造函数具有静态方法:

person.query('select * from people where id = @id', {id: 1}, function (people) {});

问题是如何为这种情况定义类型。如何定义db.model()返回构造函数,以便在我执行const bob = new Person({name: 'bob'})类型的const bob时将确定为Person

1 个答案:

答案 0 :(得分:1)

根据您提供的用法示例,这是我的最佳猜测:

interface DB { 
    model(arg: { table: "people" }): Model<PersonInitParams, Person>;
}
interface Entity { 
    save(): void;
}

type PersonInitParams = { name: string };
interface Person extends Entity { 
    // ...
}
interface Model<IP, E> { 
    (initParams: IP): E;
    new(initParams: IP): E;
    query(query: string, bindParams: {[name: string]: any}, cb: (results: E[]) => void): void;
}