模型的Sequelize-Typescript类型

时间:2019-03-14 15:23:19

标签: typescript sequelize-typescript

我正在尝试创建一个采用Sequelize模型并为它创建所有基本API的基本Crud服务,所以我做到了:

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的含义以及如何解决这个问题。

4 个答案:

答案 0 :(得分:1)

问题似乎出在这行

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 :(得分:0)

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

希望这会有所帮助。

答案 2 :(得分:0)

使用 "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>;

答案 3 :(得分:-1)

我正在处理此问题,直到单击后才找到解决方案-我使用的是NestJS,添加所有依赖项的命令指定了最新版本的sequelize,但sequelize-typescript使用了5(撰写本文时) 。所以我用yarn add sequelize@^5.0.0

解决了这个问题