TypeORM调用findOne报错:number类型与FindOneOptions<Client>无公共属性
TypeORM findOne 类型报错:Type 'number' has no properties in common with type 'FindOneOptions' 排查与解决

问题原因
该报错是TypeORM版本迭代带来的API不兼容导致:
- TypeORM 0.2.x及更早版本中,
findOne支持直接传入主键值作为参数,例如repo.findOne(1)即可查询主键ID为1的记录 - TypeORM 0.3.x及之后版本,官方移除了这个传参重载,
findOne仅接受FindOneOptions类型的配置对象作为入参,直接传入数字类型的主键值时,TS类型校验就会抛出对应错误,提示数字类型和配置对象类型没有匹配的属性。
解决方案
- 方案1:使用标准
findOne配置对象传参
错误写法(仅0.2.x版本支持):
修正后写法:// 直接传数字主键,0.3+版本会报类型错误 const client = await clientRepository.findOne(clientId);const client = await clientRepository.findOne({ where: { id: clientId } }); - 方案2:使用简化方法
findOneBy
不需要嵌套where字段,直接传入查询条件即可,写法更简洁:const client = await clientRepository.findOneBy({ id: clientId }); - 方案3(不推荐):降级TypeORM版本
如果是存量项目不想批量修改代码,可以将TypeORM版本锁定到0.2.x最新版,但该版本已停止维护,存在潜在安全和兼容性风险。
提示:TypeORM 0.3+版本所有
find*类查询方法统一了入参格式,直接传值、直接传where条件的旧写法均不再支持,要么通过where字段包裹查询条件,要么使用对应的findBy/findOneBy/countBy等简化方法。
内容的提问来源于stack exchange,提问作者Rajat Panwar
相关产品推荐
相关产品推荐

