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

如何获取NestJS DTO类的属性列表?

获取NestJS DTO类的属性列表

我有如下NestJS DTO类:

// create-job-offer.dto.ts
import { IsOptional, IsNumber } from 'class-validator';

export class CreateJobOfferDto {
  @IsNumber()
  @IsOptional()
  mentorId: number;

  @IsNumber()
  @IsOptional()
  companyId: number;
}

我需要获取该类的属性列表:['mentorId', 'companyId'],但尝试了多种方法都没成功:

Object.getOwnPropertyNames(new CreateJobOfferDto());
Object.getOwnPropertyNames(CreateJobOfferDto);

Object.getOwnPropertySymbols(new CreateJobOfferDto());
Object.getOwnPropertySymbols(CreateJobOfferDto);

Object.getOwnPropertyDescriptors(CreateJobOfferDto);
Object.getOwnPropertyDescriptors(new CreateJobOfferDto());

Object.getPrototypeOf(CreateJobOfferDto);
Object.getPrototypeOf(new CreateJobOfferDto());

如果在类里加方法或者构造函数内定义变量,能正常获取到,但就是拿不到上面的属性。我需要这个功能是因为要用Prisma和React,想在React应用里接收属性列表来动态生成表单。


解决方案

问题核心是TypeScript类的仅声明未初始化的属性,编译后不会自动挂载到类实例或原型上,所以常规的对象属性读取方法无法获取。以下是几种可行的解决方式:

1. 借助class-validator的元数据读取

因为你已经在用class-validator装饰器,它会自动给属性添加元数据,配合reflect-metadata可以直接提取属性名:

首先确保安装依赖:

npm install reflect-metadata

然后修改TypeScript配置(tsconfig.json)开启装饰器相关选项:

{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    // 其他已有配置...
  }
}

编写工具函数提取属性:

import 'reflect-metadata';
import { CreateJobOfferDto } from './create-job-offer.dto';

const getDtoProperties = (dtoClass: any) => {
  const prototype = dtoClass.prototype;
  // 过滤掉默认的constructor属性
  return Object.getOwnPropertyNames(prototype).filter(prop => prop !== 'constructor');
};

// 调用示例
const properties = getDtoProperties(CreateJobOfferDto);
console.log(properties); // 输出 ['mentorId', 'companyId']

2. 手动初始化DTO属性

在DTO类的构造函数中给所有属性赋初始值,这样实例化后属性会被挂载到对象上:

export class CreateJobOfferDto {
  @IsNumber()
  @IsOptional()
  mentorId: number;

  @IsNumber()
  @IsOptional()
  companyId: number;

  constructor() {
    // 给属性赋初始值(可选类型可以用null/undefined)
    this.mentorId = 0;
    this.companyId = 0;
  }
}

之后就能通过Object.getOwnPropertyNames(new CreateJobOfferDto()).filter(prop => prop !== 'constructor')获取属性列表。

3. 构建时静态提取(适合React前端场景)

如果要在React中动态生成表单,可以用ts-morph这类代码解析工具,在构建阶段提取DTO属性并生成静态JSON文件,供前端直接读取:

安装依赖:

npm install ts-morph --save-dev

编写提取脚本:

import { Project } from 'ts-morph';
import fs from 'fs';

const project = new Project();
const sourceFile = project.addSourceFileAtPath('./src/create-job-offer.dto.ts');
const dtoClass = sourceFile.getClass('CreateJobOfferDto');

const properties = dtoClass?.getProperties().map(prop => prop.getName()) || [];
// 将属性列表写入JSON文件
fs.writeFileSync('./public/dto-properties.json', JSON.stringify(properties));

之后在React中直接请求这个JSON文件就能拿到属性列表,无需运行时依赖。


内容的提问来源于stack exchange,提问作者AlbertMunichMar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:31:06