You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:45:03