【问题标题】:Enforcing type with generics in typescript and sequelize在 typescript 和 sequelize 中使用泛型强制类型
【发布时间】:2019-09-28 20:47:36
【问题描述】:

我有一个抽象服务,它在其构造函数中获取存储库并使用 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。有没有人对如何执行泛型有任何建议?

干杯

【问题讨论】:

    标签: typescript typescript-generics sequelize-typescript


    【解决方案1】:

    你想使用&lt;T extends Class&gt;:

    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

    【讨论】:

    • 嗯,问题是即使 UserInfosRepository 也是通用的,所以它会扩展 BaseRepository 但这也不起作用
    【解决方案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>
    

    希望这对像我一样努力寻找包括泛型和续集在内的解决方案的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 2019-05-30
      • 2021-12-06
      相关资源
      最近更新 更多