如何获取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
相关产品推荐
相关产品推荐

