Принуждение типа с помощью дженериков в машинописном тексте и сиквеле

У меня есть абстрактная служба, которая принимает репозиторий в своем конструкторе и получает данные с помощью 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, а не использовать любой. Проблема в том, что компилятор не распознает T как UsersInfosRepository и не найдет метод findId. У кого-нибудь есть какие-либо предложения о том, как обеспечить соблюдение общего?

Ваше здоровье


person user3353167    schedule 10.05.2019    source источник


Ответы (2)


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

Я изменил абстрактный 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>

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

person user3353167    schedule 11.05.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

person wormania    schedule 11.05.2019
comment
проблема в том, что даже UserInfosRepository является универсальным, поэтому он будет расширять BaseRepository‹U (который должен быть UserModel)›, но это тоже не работает - person user3353167; 11.05.2019