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符合要求,因此抛出类型不兼容错误。
解决步骤
- 从
typeorm包中导入ObjectLiteral类型 - 给泛型参数
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
相关产品推荐
相关产品推荐

