TypeORM泛型仓库findById方法类型错误求助
TypeORM泛型仓库findById类型错误解决方案
问题原因
TypeScript无法自动推断{ id: object.id }符合TypeORM的FindOptionsWhere<T>类型约束——虽然你的T继承了IEntity,但泛型层面的类型信息不够明确,TypeORM的查询条件类型需要精确匹配实体的属性结构,导致类型校验失败。
解决方法
1. 确保IEntity的id属性定义明确
先检查你的IEntity接口,必须明确声明id的类型,比如:
// entities/IEntity.ts export interface IEntity { id: number; // 或对应你的实体id类型,比如string }
2. 修改泛型仓库的findById方法
有两种常用的修复方式:
方式一:添加类型断言
直接告诉TypeScript,你的查询条件符合FindOptionsWhere<T>类型:
// genericRepository.ts import { Repository, FindOptionsWhere } from "typeorm"; // ... 其他导入 export default abstract class GenericRepository<T extends IEntity> implements IReposytory<T> { // ... 其他代码 async findById(object: T): Promise<T | null> { return await this.repository.findOne({ where: { id: object.id } as FindOptionsWhere<T> }); } // 如果一定要用数组形式的查询条件: // async findById(object: T): Promise<T | null> { // return await this.repository.findOne({ // where: [{ id: object.id }] as FindOptionsWhere<T>[] // }); // } }
方式二:强化泛型约束
给泛型T添加更严格的约束,明确T必须包含id属性,让TypeScript自动推断类型:
// genericRepository.ts export default abstract class GenericRepository<T extends IEntity & { id: number }> implements IReposytory<T> { // ... 其他代码 async findById(object: T): Promise<T | null> { return await this.repository.findOne({ where: { id: object.id } }); } }
补充说明
你在CarRepository中重写findById不会报错,是因为Car是具体实体,TypeScript能明确识别它的id属性结构;而泛型仓库中T是抽象类型,需要额外的类型提示或约束来通过校验。
内容的提问来源于stack exchange,提问作者Marcelo Hernades Romano
相关产品推荐
相关产品推荐

