【问题标题】:Type 'T' is not assignable to type 'ObjectLiteral'类型 \'T\' 不可分配给类型 \'ObjectLiteral\'
【发布时间】:2022-11-11 03:39:40
【问题描述】:

我想以这种方式实现通用存储库/服务模式

import { EntityTarget, FindOptionsWhere } from "typeorm";

import { AppDataSource as db } from "../database";

export const getAllSerivce  = async <T>(
  entity: EntityTarget<T>,
  query?: FindOptionsWhere<T>
) => {
  const repository = db.getRepository(entity);
  const res = query ? await repository.findBy(query) : await repository.find();
  return res;
};

但我收到了这个错误:

'EntityTarget' 类型的参数不可分配给 输入“实体目标”。类型'{类型:T;名称:字符串; }' 不可分配给类型 'EntityTarget'。 类型'{类型:T;名称:字符串; }' 不可分配给类型 '{ type: ObjectLiteral;名称:字符串; }'。 属性“类型”的类型不兼容。 类型 'T' 不可分配给类型 'ObjectLiteral'.ts(2345) generic.service.ts(5, 38):此类型参数可能需要 extends ObjectLiteral 约束。

【问题讨论】:

  • 您是否尝试过按照错误消息的提示进行操作? async &lt;T extends ObjectLiteral&gt;(...) =&gt; ...
  • @caTS 我认为它现在可以工作了

标签: typescript express typeorm typescript-generics


【解决方案1】:

由于EntityTargetFindOptionsWhereT 有一个通用约束,因此您还需要将该约束添加到您的函数中:

export const getAllSerivce  = async <T extends ObjectLiteral>(
//                                   ^^^^^^^^^^^^^^^^^^^^^^^
  entity: EntityTarget<T>,
  query?: FindOptionsWhere<T>
) => {
  const repository = db.getRepository(entity);
  const res = query ? await repository.findBy(query) : await repository.find();
  return res;
};

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 2018-09-19
    • 2016-07-31
    • 2020-10-28
    • 2021-11-16
    • 2017-12-29
    • 2019-01-31
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多