[英]How to list properties of a Nestjs DTO class?
我有以下 Nestjs DTO class:
// create-job-offer.dto.ts
import { IsOptional, IsNumber } from 'class-validator';
export class CreateJobOfferDto {
@IsNumber()
@IsOptional()
mentorId: number;
@IsNumber()
@IsOptional()
companyId: number;
}
我想獲取 class 屬性的列表: ['mentorId', 'companyId']
。
到目前為止,我在 controller 中嘗試了以下方法但沒有成功:
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 應用程序中,我想接收 class 屬性的列表,以便我可以動態生成 model 表單。
沒有簡單直接的方法來獲取 DTO class 的屬性列表,或者更全面地說,任何類型的 class 只有屬性。
原因是每當你定義一個沒有任何值的屬性時,它在編譯到 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 class,如下所示:
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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.