I'm trying to create a base crud service that takes a Sequelize model and creates all basic APIs for it so what I have done it this:
export class RepositoryService<T extends Model<T>> {
  constructor(protected model: typeof Model) {
  }
  public async getMany(
    query: RequestParamsParsed = {},
    options: RestfulOptions = {},
  ): Promise<T[]> {
    return this.model.findAll();
  }
}
I'm getting the following error:
The 'this' context of type 'typeof Model' is not assignable to method's 'this' of type 'new () => Model<Model<any>>'.
  Cannot assign an abstract constructor type to a non-abstract constructor type.
this is because of this line in the seqeulize-typescript package:
static findAll<T extends Model<T>>(this: (new () => T), options?: IFindOptions<T>): Promise<T[]>;
I'm relatively new to Typescript so if anyone can tell me what's the meaning of this: (new () => T) in the findAll function and how can I work this out.
Also encountered this error while working with the sequelize-typescript library. 
You could first define these helper types:
import { Model } from "sequelize-typescript";
// Type `ModelType` would basically wrap & satisfy the 'this' context of any sequelize helper methods
type Constructor<T> = new (...args: any[]) => T;
type ModelType<T extends Model<T>> = Constructor<T> & typeof Model;
Then, use it with your code:
export class RepositoryService<T extends Model<T>> {
  constructor(protected model: ModelType<T>) {}
  public async getMany(
    query: RequestParamsParsed = {},
    options: RestfulOptions = {},
  ): Promise<T[]> {
    return this.model.findAll();
  }
}
Hope this helps.
The problem seemed to be in this line
constructor(protected model: typeof Model) {}
The Model I was setting the model type to is imported from sequelize-typescript while I should use the original model exported from sequelize itself.
The whole code is like this:
import { Model as OriginalModel } from 'sequelize';
import { Model } from 'sequelize-typescript';
export class RepositoryService<T extends Model<T>> {
  constructor(protected model: typeof OriginalModel) {
  }
  public async getMany(
    query: RequestParamsParsed = {},
    options: RestfulOptions = {},
  ): Promise<T[]> {
    return this.model.findAll();
  }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With