Продолжить-Typescript typeof model

#typescript #sequelize-typescript

#typescript #продолжить-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 функции и как я могу с этим разобраться.

Комментарии:

1. arg: (new () => T) означает, что arg не является экземпляром типа, T как в (arg: T) . аргумент — это класс T. Также вы можете использовать этот синтаксис для этого (arg: { new (...args): T })

Ответ №1:

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

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

 import { Model } from "sequelize-typescript";

// Type `ModelType` would basically wrap amp; satisfy the 'this' context of any sequelize helper methods
type Constructor<T> = new (...args: any[]) => T;
type ModelType<T extends Model<T>> = Constructor<T> amp; 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();
  }
}
  

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

Ответ №2:

Используя, "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) amp; NonAbstract<typeof Model>;

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

  

Ответ №3:

Проблема, похоже, была в этой строке

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

Комментарии:

1. Лучшее решение от @Adrian ниже.