如何从TypeORM实体类中获取所有实例字段组成的数组
你之前的写法失效的核心原因是:TypeScript中仅做类型声明、未初始化/未在构造函数中赋值的类属性,编译为JavaScript后会被直接移除,实例化后的对象上根本不存在这些属性,所以Object.keys返回空数组。
针对TypeORM实体的场景,有两种成熟的实现方案:
方案1:直接读取TypeORM元数据(推荐)
TypeORM会在解析@Entity、@Column等装饰器时把实体的列信息存入全局元数据存储,直接读取元数据就能拿到所有列的字段名,无需修改实体定义:
import { getMetadataArgsStorage } from 'typeorm'; // 过滤出User实体的所有列,提取属性名 const userFieldNames = getMetadataArgsStorage() .columns .filter(column => column.target === User) .map(column => column.propertyName); console.log(userFieldNames); // 输出 ['id', 'firstName', 'lastName', 'isActive']
这个方案的优势是完全匹配TypeORM的列定义,不会把实体中非列的普通字段算进去,准确性最高。
方案2:给类属性添加初始值
如果你不需要和TypeORM的列定义严格对齐,只是想拿到类的所有实例字段,可以给每个属性添加默认初始值,确保编译后属性会保留在实例上:
@Entity() export class User { @PrimaryGeneratedColumn() id: number = 0; @Column() firstName: string = ''; @Column() lastName: string = ''; @Column() isActive: boolean = false; }
修改后直接实例化User类就能拿到所有字段:
console.log(Object.keys(new User())); // 输出 ['id', 'firstName', 'lastName', 'isActive']
不需要额外继承子类,直接实例化原实体类即可。
内容的提问来源于stack exchange,提问作者HexaCrop
相关产品推荐
相关产品推荐

