如何列出一个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应用程序中,我想要接收类属性列表,以便我可以动态生成模型表单。

没有简单直接的方法来获取DTO类的属性列表,或者更全面地说,任何类型的类都只有属性。

原因是无论何时你定义了一个没有任何值的属性,它在编译到javascript后就会消失。

例子:

// typescript
class A {
private readonly property1: string;
public readonly property2: boolean;
}

编译成这样:

// javascript
"use strict";
class A {}

为了实现这个目标,您需要编写一个自定义装饰器。这样的:

const properties = Symbol('properties');
// This decorator will be called for each property, and it stores the property name in an object.
export const Property = () => {
return (obj: any, propertyName: string) => {
(obj[properties] || (obj[properties] = [])).push(propertyName);
};
};
// This is a function to retrieve the list of properties for a class
export function getProperties(obj: any): [] {
return obj.prototype[properties];
}
假设我有一个用户的DTO类,如下所示:
import { getProperties } from './decorators/property.decorator';
export class UserDto {
@Property()
@IsNotEmpty()
firstName: string;
@Property()
@IsEmail()
@IsOptional()
public readonly email: string;
}

,我想在一个列表中获得所有属性,所以我们需要调用之前定义的getProperties方法,所以:

import { UserDto } from './dtos/user.dto';
getProperties(UserDto); // [ 'firstName', 'email' ]

你也可以使用npm模块ts-transformer-keys。

一个TypeScript自定义转换器,用来获取给定类型的键。

如何使用:

import { keys } from 'ts-transformer-keys';
interface Props {
id: string;
name: string;
age: number;
}
const keysOfProps = keys<Props>();
console.log(keysOfProps); // ['id', 'name', 'age']

相关内容

  • 没有找到相关文章