TypeScript报错:User类型无法赋值给EntityTarget类型参数
问题说明
开发时向函数传入Entity类型参数,函数内部调用TypeORM的find方法触发类型报错,相关代码与错误信息如下:
- 实体联合类型定义:
export type Entities = User | Blog | Service
- 业务函数实现:
import AppDataSource from '../database' import { Entities } from '../entity/index' import User from '../entity/User' const getList = async (entity: Entities) => { const list = (await AppDataSource.manager.find(entity)) }
- 抛出的类型错误(中文翻译):
类型为
Entities的参数无法赋值给EntityTarget类型的参数。类型User无法赋值给EntityTarget类型。
报错原因
类型定义出现概念混淆:当前声明的Entities是实体类的实例类型(即new User()生成的实例对象的类型),但AppDataSource.manager.find()要求传入的是EntityTarget类型,也就是实体类构造函数、表名字符串这类用于定位实体Schema的标识。实际调用时传入的是User/Blog/Service类本身,和声明的实例类型不匹配,因此触发类型校验错误。
修复方法
选择以下任意一种方案调整即可:
- 方案1:修改联合类型为实体类构造器类型
从TypeORM导入内置的ObjectType工具类型,重新定义Entities为实体类构造器的联合,匹配实际传参:
原业务函数不需要其他改动,类型即可正常匹配。import { ObjectType } from 'typeorm' import User from './User' import Blog from './Blog' import Service from './Service' export type Entities = ObjectType<User | Blog | Service> - 方案2:直接使用TypeORM内置的
EntityTarget类型作为参数类型
如果后续需要兼容传入表名字符串等其他合法实体目标入参,可以直接用官方内置类型做参数声明,不需要额外定义联合类型:import { EntityTarget } from 'typeorm' import AppDataSource from '../database' import User from '../entity/User' import Blog from '../entity/Blog' import Service from '../entity/Service' const getList = async (entity: EntityTarget<User | Blog | Service>) => { const list = await AppDataSource.manager.find(entity) }
内容的提问来源于stack exchange,提问作者mrpoyraz
相关产品推荐
相关产品推荐

