TypeOrm+NestJs+Typescript 数据类型最佳实践:如何减少类型修改耗时
问题解答
现象说明
这种需要多端同步修改类型的情况在未做类型复用设计的NestJS + TypeORM + TypeScript 项目中非常常见,但不属于必须接受的正常开发流程,通过合理的工程化设计可以大幅降低这类重复工作量。
最佳实践
- 基于Entity复用基础类型,搭配NestJS映射类型工具生成DTO
你不需要独立定义和Entity字段高度重合的TS基础接口、增改查DTO,直接用@nestjs/mapped-types包提供的PartialType、PickType、OmitType、IntersectionType工具类从Entity类直接生成DTO类,这类工具会自动保留类的装饰器,同时同步字段类型。示例:
后续调整Entity字段时,对应的DTO会自动同步类型,不需要手动修改多处。// 原TypeORM Entity @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() username: string; @Column() password: string; @CreateDateColumn() createTime: Date; } // 生成创建用户DTO:排除自动生成的id、createTime、敏感字段password export class CreateUserDto extends OmitType(User, ['id', 'createTime', 'password'] as const) {} // 生成更新用户DTO:所有创建DTO的字段都可选 export class UpdateUserDto extends PartialType(CreateUserDto) {} // 生成返回用户DTO:排除敏感字段password export class UserResponseDto extends OmitType(User, ['password'] as const) {} - 统一字段命名映射规则,消除手动映射成本
配置TypeORM的命名策略为驼峰转下划线,自动将Entity中的驼峰字段映射为PostgreSQL中的下划线格式字段,不需要每个字段手动指定@Column({ name: 'xxx_xxx' }),避免字段名不匹配导致的多端同步修改。 - 用代码生成工具自动生成重复代码
对于表结构变更频繁的场景,可以写简单的自定义脚本,或者使用成熟的代码生成工具,根据数据库表结构或者Entity定义,自动生成基础DTO、CRUD服务骨架、接口定义等重复代码,一次生成多处同步。 - 拆分类型职责,避免过度定义重复类型
不需要为每个接口单独定义完全重复的DTO,只有当某个接口需要特殊字段、特殊校验规则时,再基于通用DTO做扩展即可,减少需要维护的类型数量。 - 搭配TypeORM迁移做结构同步
所有数据库结构变更都通过TypeORM迁移实现,直接修改Entity后自动生成迁移文件,保证Entity和数据库结构完全一致,不需要手动修改数据库表结构。
内容的提问来源于stack exchange,提问作者ente
相关产品推荐
相关产品推荐

