Я пытаюсь создать несколько служебных классов для своего веб-сервиса RESTful, чтобы уменьшить количество шаблонного кода.
Вот упрощенный пример моих служебных классов:
class Model {
public static async findAll(options: any) {
return Promise.resolve([]);
}
}
class Service<M> {
public model: M;
// this will fix the following problem with "findAll". But we can't access "User" model members in "UsersService"
// public model: typeof Model;
constructor(options: { model: any }) {
this.model = options.model;
}
public async find(params?: any): Promise<any> {
return this.model.findAll(params); // error: Property 'findAll' does not exist on type 'M'
}
}
Пример использования:
class User extends Model {
firstName: string;
lastName: string;
constructor(options: any) {
super();
this.firstName = options.firstName;
this.lastName = options.lastName;
}
}
class UsersService extends Service<typeof User> {
constructor() {
super({ model: User });
}
public async customMethod() {
const users = this.find({});
const newUser = new this.model({ firstName: 'foo', lastName: 'bar' });
newUser.firstName // ok
newUser.lastName // ok
}
}
Я не могу понять, как мне определить параметры типа для класса Service, чтобы я мог получить доступ к findAll в классе Service, а также получить доступ к полям firstName и lastName в UsersService?
Если я определяю параметр типа как M extends Model, я все равно не могу получить доступ к статическим членам.
class Service<M extends typeof Model> {
, что заставляет все работать, за исключением того, что я получаюType 'typeof User' does not satisfy the constraint 'typeof Model'.
, что не имеет для меня особого смысла. - person Alex Wayne   schedule 04.08.2020new()
, чтобы все, реализующее этот интерфейс, было вынуждено реализовать сигнатуру конструктора совместимым образом. - person Evert   schedule 05.08.2020