如何获取QueryDeepPartialEntity或同类类型用于TypeORM实体创建?
在TypeORM中实现类似QueryDeepPartialEntity的功能
TypeORM本身支持灵活的实体字段控制,要实现类似QueryDeepPartialEntity的部分字段实体创建功能,可以通过以下几种方式实现,适配不同场景:
1. 基础场景:直接使用内置Partial类型
如果你的实体没有嵌套关联关系,直接用Partial<User>数组就能满足批量插入需求——TypeORM的insert()方法会自动忽略未传入的字段:
const userPayload: Partial<User>[] = []; userPayload.push({ age: 12, id: 0, firstName: "", lastName1: "", }); const queryBuilder = AppDataSource.createQueryBuilder(); await queryBuilder.insert().into(User).values(userPayload).execute();
2. 深层嵌套场景:自定义DeepPartial类型
如果实体包含嵌套对象或数组(比如用户关联地址、订单等子实体),需要让所有层级的字段都可选,可以自定义一个递归的DeepPartial类型:
// 定义深层递归可选类型 type DeepPartial<T> = { [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends object ? DeepPartial<T[P]> : T[P]; }; // 使用自定义类型定义批量插入数据 const userPayload: DeepPartial<User>[] = []; userPayload.push({ age: 12, firstName: "", // 假设User包含嵌套的Address实体,可仅传入部分字段 address: { city: "Beijing" } }); const queryBuilder = AppDataSource.createQueryBuilder(); await queryBuilder.insert().into(User).values(userPayload).execute();
这个类型会递归处理所有嵌套结构,完全模拟QueryDeepPartialEntity的深层可选能力。
3. 精准控制场景:自定义CreateMany风格类型
如果你想更贴近Prisma中Prisma.FactorsCreateManyInput的精准字段控制,可以自定义仅包含插入允许字段的类型:
// 定义仅包含允许插入字段的类型 type UserCreateManyInput = Pick<User, 'id' | 'age' | 'firstName' | 'lastName1'>; // 结合Partial让字段可选 type UserCreateManyPartialInput = Partial<UserCreateManyInput>; // 使用该类型 const userPayload: UserCreateManyPartialInput[] = []; userPayload.push({ age: 12, id: 0, firstName: "", lastName1: "", }); const queryBuilder = AppDataSource.createQueryBuilder(); await queryBuilder.insert().into(User).values(userPayload).execute();
这种方式能严格限制插入时可传入的字段,避免误传实体中不允许被插入的属性。
内容的提问来源于stack exchange,提问作者Alexander V
相关产品推荐
相关产品推荐

