Модель типа Sequelize-Typescript

Я пытаюсь создать базовую службу crud, которая использует модель Sequelize и создает для нее все основные API-интерфейсы, так что я сделал это:

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();
  }
}

Я получаю следующую ошибку:

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.

это из-за этой строки в пакете seqeulize-typescript:

static findAll<T extends Model<T>>(this: (new () => T), options?: IFindOptions<T>): Promise<T[]>;

Я относительно новичок в Typescript, поэтому, если кто-нибудь может сказать мне, что означает this: (new () => T) в функции findAll и как я могу это решить.


person Sami    schedule 14.03.2019    source источник
comment
arg: (new () => T) означает, что arg не является экземпляром типа T, как в (arg: T). arg - это класс T. Также вы можете использовать этот синтаксис для этого (arg: { new (...args): T })   -  person Przemyslaw Jan Beigert    schedule 14.03.2019


Ответы (3)


Также столкнулся с этой ошибкой при работе с библиотекой sequelize-typescript.

Вы можете сначала определить эти вспомогательные типы:

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;

Затем используйте его со своим кодом:

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();
  }
}

Надеюсь это поможет.

person Adrian    schedule 06.01.2020

Проблема оказалась в этой строке

constructor(protected model: typeof Model) {}

Тип модели Model, который я устанавливал, импортируется из sequelize-typescript, в то время как я должен использовать исходную модель, экспортированную из самого sequelize.

Весь код такой:

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();
  }
}
person Sami    schedule 17.03.2019
comment
Лучшее решение от @Adrian ниже. - person vaughan; 23.09.2020

Используя "sequelize-typescript": "2.1.0", вы можете использовать ModelCtor, предоставляемый модулем, например.

import { Model, ModelCtor } from 'sequelize-typescript';

export class RepositoryService<T extends Model<T>> {
  constructor(protected model: ModelCtor<T>) {}

  public async getMany(
    query: RequestParamsParsed = {}, 
    options: RestfulOptions = {}
): Promise<T[]> {
    return this.model.findAll();
  }
}

Тип ModelCtor:

export declare type Repository<M> = (new () => M) & NonAbstract<typeof Model>;

export declare type ModelCtor<M extends Model = Model> = Repository<M>;

person Josh Stuart    schedule 26.06.2021