首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sequelize-Typescript类型的模型

Sequelize-Typescript类型的模型
EN

Stack Overflow用户
提问于 2019-03-14 23:23:19
回答 3查看 4.8K关注 0票数 6

我正在尝试创建一个基本的crud服务,该服务采用Sequelize模型并为其创建所有基本API,因此我所做的是:

代码语言:javascript
复制
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();
  }
}

我得到以下错误:

代码语言:javascript
复制
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包中的这一行:

代码语言:javascript
复制
static findAll<T extends Model<T>>(this: (new () => T), options?: IFindOptions<T>): Promise<T[]>;

我对Typescript比较陌生,所以如果有人能告诉我findAll函数中的this: (new () => T)是什么意思,我该如何解决这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-18 04:22:20

问题似乎出在这条线上。

代码语言:javascript
复制
constructor(protected model: typeof Model) {}

我设置模型类型的Model是从sequelize-typescript导入的,而我应该使用从sequelize本身导出的原始模型。

整个代码是这样的:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-01-06 17:44:36

在使用sequelize-typescript库时也遇到了此错误。

您可以首先定义这些帮助器类型:

代码语言:javascript
复制
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;

然后,在您的代码中使用它:

代码语言:javascript
复制
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();
  }
}

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2021-06-26 11:06:51

使用"sequelize-typescript": "2.1.0",你可以使用模块提供的ModelCtor,例如。

代码语言:javascript
复制
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类型为:

代码语言:javascript
复制
export declare type Repository<M> = (new () => M) & NonAbstract<typeof Model>;

export declare type ModelCtor<M extends Model = Model> = Repository<M>;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55166230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档