Обеспечение типа с обобщениями в машинописи и sequelize - PullRequest
0 голосов
/ 11 мая 2019

У меня есть абстрактный сервис, который берет репозиторий в своем конструкторе и получает данные с помощью Sequelize.Абстрактная служба выглядит следующим образом:

export abstract class BaseService<T> {

  public constructor(private _repo: any) {

  }
  public findById(id: string) {
    return this._repo.findById(id).pipe(
      map(res => Response.ok(res)))
    )
  }
}

, где T - это тип репозитория:

export class UsersInfosRepository extends BaseRepository<UserInfosModel>{
  public findById(id: string): Observable<UserInfosModel | null> {
    return from(UserInfosModel.findById(id));
  }
}

UserInfosModel - это сиквелизированный класс @Model.

Теперь это работает нормально, но единственное, что я хочу, чтобы тип был

_repo

с универсальным T вместо использования any.Проблема в том, что компилятор не распознает T как UsersInfosRepository и не найдет метод findId.Кто-нибудь получил какие-либо предложения о том, как обеспечить применение дженерика?

Приветствия

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Итак, в конце концов я нашел решение

Я изменил абстрактный BaseRepository в интерфейс:

export interface IBaseRepository<T> {
  findById(id: string): Observable<T | null>;
}

и отредактировал BaseService для принятия:

export abstract class BaseService<T extends IBaseRepository<U>, U> 

Где T - любой репозиторий, а U - любая модель.

export class UsersService extends BaseService<UsersInfosRepository, UserInfosModel>

надеюсь, это поможет всем, кто, как я, изо всех сил пытался найти решение, включающее дженерики и секвелиз.

0 голосов
/ 11 мая 2019

Вы хотите использовать <T extends Class>:

export abstract class BaseService<T extends UsersInfosRepository> {

  public constructor(private _repo: T) {

  }
  public findById(id: string) {
    return this._repo.findById(id).pipe(
      map(res => Response.ok(res)))
    )
  }
}

Для получения дополнительной информации: https://www.typescriptlang.org/docs/handbook/generics.html

...