簡體   English   中英

如何列出 Nestjs DTO class 的屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM