You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM泛型仓储/服务模式实现报错:Type 'T'不可赋值给ObjectLiteral

TypeORM泛型仓储/服务模式类型错误解决办法

原代码

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”的参数不能赋给类型“EntityTarget”的参数。
类型“{ type: T; name: string; }”不能赋给类型“EntityTarget”。
类型“{ type: T; name: string; }”不能赋给类型“{ type: ObjectLiteral; name: string; }”。
属性“type”的类型不兼容。
类型“T”不能赋给类型“ObjectLiteral”。ts(2345)
generic.service.ts(5, 38): 此类型参数可能需要一个extends ObjectLiteral约束。

问题原因

TypeORM的getRepository方法要求传入的实体必须是ObjectLiteral的子类,当前泛型参数T没有类型约束,TypeScript无法确认T符合要求,因此抛出类型不兼容错误。

解决步骤

  1. 从typeorm包中导入ObjectLiteral类型
  2. 给泛型参数T添加extends ObjectLiteral约束,确保T属于ObjectLiteral的子类范畴

修改后的完整代码

import { EntityTarget, FindOptionsWhere, ObjectLiteral } from "typeorm";

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

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;
};

内容的提问来源于stack exchange,提问作者rahim bait

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:15:34