#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 ниже.