在TypeScript (TS) 和 TypeORM 中创建泛型函数允许代码在保持强类型的同时更具可重用性。下面,我将介绍一个例子来展示如何在TypeORM中使用TS创建泛型函数来处理数据库实体的通用操作。
示例:创建一个通用的CRUD操作函数
-
定义一个泛型接口
首先,我们需要定义一个泛型接口,它将定义所有实体必须实现的方法。这就为我们提供了一个通用的方式来处理不同的实体。
typescriptinterface IGenericCRUD<T> { create(item: T): Promise<T>; read(id: number): Promise<T | null>; update(id: number, item: T): Promise<T>; delete(id: number): Promise<void>; }
-
实现泛型类
接下来,我们定义一个泛型类,该类实现了
IGenericCRUD
接口。这个类将利用TypeORM的Repository来实现CRUD操作。typescriptimport { Repository, EntityTarget, getRepository } from 'typeorm'; class GenericCRUD<T> implements IGenericCRUD<T> { private entity: EntityTarget<T>; private repo: Repository<T>; constructor(entity: EntityTarget<T>) { this.entity = entity; this.repo = getRepository(this.entity); } async create(item: T): Promise<T> { return this.repo.save(item); } async read(id: number): Promise<T | null> { return this.repo.findOne(id); } async update(id: number, item: T): Promise<T> { await this.repo.update(id, item); return this.read(id); } async delete(id: number): Promise<void> { await this.repo.delete(id); } }
-
使用泛型类
现在我们可以创建特定类型的CRUD实例。例如,如果我们有一个
User
实体,我们可以这样使用:typescriptimport { User } from './entities/User'; const userCRUD = new GenericCRUD<User>(User); async function demoUserCRUD() { // 创建用户 const newUser = await userCRUD.create({ firstName: "Xiao", lastName: "Ming" }); // 读取用户 const user = await userCRUD.read(newUser.id); // 更新用户信息 const updatedUser = await userCRUD.update(user.id, { ...user, lastName: "Li" }); // 删除用户 await userCRUD.delete(updatedUser.id); }
总结
通过使用泛型,我们可以创建一个强类型且可重用的CRUD类,它可以与任何TypeORM实体一起使用。这不仅减少了代码重复,也提高了代码的可维护性和类型安全。
2024年8月3日 16:58 回复