Combining various DTOs in a seamless manner for validation in TypeScript is made easy with the class-validator fusion technique

As I delved into my NestJS project, I found the class-validation aspect to be quite bothersome. It felt like I was constantly repeating the same classes with identical decorators.

For example:

export class DTO1 {
    @IsDefined()
    @IsString()
    name: string;

    @IsDefined()
    @Type(() => Number)
    @IsInt()
    client: number;

    @IsDefined()
    @IsIn(['value1', 'value2'])
    role: 'value1' | 'value2';
}

... (other DTO classes) ...

export class Base {
    @IsDefined()
    @IsString()
    elemEveruoneHas: string;
}

export class DTO1 extends Base {
    @IsDefined()
    @IsNotEmpty()
    @Type(() => Number)
    @IsInt()
    id: number;
}

This repetition made me realize that some elements were common across multiple DTOs but not consistently enough to create a base class and extend it.

... (base class setup) ... 

I wanted to streamline this by creating generic classes for recurring elements and then generating them into specific DTOs.

The desired structure would be:

... (new DTO classes approach) ...

However, the current implementation, as shown below, is functional but lacks elegance:

... (improved but still unwieldy setup) ...

I am seeking advice on how to enhance this process so that I can avoid reconstructing the entire setup for each element class. Is there a way to incorporate a function that generates inherited classes with chaining inheritance to simplify something like DTO(Test1, Test2, Test3)?

Answer №1

Although it may not be in the precise format you had envisioned, it is possible to accomplish this using Nest's @nestjs/mapped-types and its IntersectionType. For example, you could create a DTO class like so:

export class DTO extends IntersectionType(Class1, IntersectionType(Class2, Class3)) {}
, making sure to properly nest as needed.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

The continuity of service value across parent and child components is not guaranteed

My goal is to update a value in a service from one component and retrieve it in another. The structure of my components is as follows: parent => child => grandchild When I modify the service value in the first child component, the parent receives t ...

Best practices for using useEffect to fetch data from an API_FETCH in a certain condition

When retrieving state from an API using Zustand within a useEffect function, what is the recommended approach to do so? Currently, my implementation is quite straightforward: export interface ModeState{ modes: Mode[]; fetchModes: () => void; } expo ...

Issues arise in Ionic 3 when attempting to use scripts or external custom jQuery plugins within inner pages

When I utilize a script tag in my index.HTML file, it functions properly on the initial or root pages of Ionic 3. However, upon navigating to other pages using NavController, the script ceases to work on these inner pages. How can I implement a custom jQ ...

Is there a way to efficiently compare multiple arrays in Typescript and Angular?

I am faced with a scenario where I have 4 separate arrays and need to identify if any item appears in more than two of the arrays. If this is the case, I must delete the duplicate items from all arrays except one based on a specific property. let arrayA = ...

Alert the parent angular component of any changes in the object

I am working with a large object in my component, where the properties of the object are connected to various components and inputs within the template: constructor() { this.data = { identifier: null, isRequired: true, title: ' ...

Creating a Modal using Typescript with NextJS

Currently, I'm working on creating a modal within my app using NextJS with Typescript. Unfortunately, I've been struggling to eliminate the warning associated with my modal selector. Can someone provide guidance on how to properly type this? cons ...

Utilizing variables to set the templateUrl in Angular2

Trying to assign a variable to the templateUrl in my component, but it's not functioning as expected. @Component({ selector: 'article', templateUrl: '{{article.html}}', styleUrls: ['styles/stylesheets/article.comp ...

Is combining NestJS and NextJS for authentication the next evolution in architecture?

I'm just starting with NestJS and I'm working on setting up a JWT-based authentication system. My goal is to generate a JWT token and handle it on the server side. The frontend is built with Next.js, so I'm considering using Next.js API rout ...

Angular 2's Dependency Injection injects functions instead of objects

My application has a 'store' service that depends on a 'repo' service. The issue I'm facing is that the 'store' service is being injected correctly, but the 'repo' service it receives appears to be a function in ...

ESLint version 8.0.0 encountered an error while attempting to fetch the '@typescript-eslint' plugin

Hey there, I'm in need of some assistance. I encountered an error while trying to build a project. Uh-oh! Something didn't go as planned! :( ESLint: 8.0.0 TypeError: Failed to load plugin '@typescript-eslint' specified in ' ...

Synchronize Docker volumes

Hey there! I've been trying to dive into learning Docker, but I'm having trouble syncing the host and container using volumes when making changes and saving code (specifically using npm run dev). Every time I need to restart docker-compose up --b ...

Error: Attempting to access the 'subscribe' property of an undefined value (Observable)

In my TypeScript/Angular2/SPFx project, I have the following code snippet: // Populate the regulatory documents dropdown this.regulatoryDocumentsService.fetchRegulatoryDocumentsData().subscribe( data => { this.regulatoryDocumentsData = data }, ...

Creating a conditional class property requirement in TypeScriptAnother way to implement conditionally required class

I am currently in the process of creating an Event class with a data property that is typed based on the type of the event. Here is the code snippet I have been working on: export interface EventTypes { localeChange: { locale: string; }; translat ...

What is the reason behind TypeScript condition type not functioning properly with optional parameters?

I am trying to determine if the first argument of a function is optional. Here is what I have written: type F1 = (payload?: number) => null; type Res1 = F1 extends (a?: any) => any ? 1 : 2; // result: 1 type Res2 = F1 extends (a: any) => any ? 1 : ...

Is there a way to configure ESLint so that it strictly enforces either all imports to be on separate lines or all on a single line?

I am currently using ESLint for TypeScript linting. I want to set up ESLint in a way that requires imports to be either all on separate lines or all on a single line. Example of what is not allowed: import { a, b, c, d } from "letters"; Allo ...

The UploadFile Interface seems to be missing

Can someone clarify whether the @UploadedFile decorator's interface is predefined or if I need to define it myself? ...

React's componentDidUpdate being triggered before prop change occurs

I am working with the CryptoHistoricGraph component in my app.js file. I have passed this.state.coinPrices as a prop for this element. import React from 'react'; import axios from 'axios'; import CryptoSelect from './components/cry ...

Issue with Angular ngFor not updating radio button value when ngModel is set

Hello, I am fairly new to working with Angular and could really use some assistance with a problem I've run into. Essentially, I am receiving an array of objects from an API like this: [{name: "abc", score: 2},{name: ""def, score: ...

Issues with Rxjs pipe and Angular's Http.get() functionality are causing complications

Working with an Angular 4 Component that interacts with a Service to fetch data is a common scenario. Once the data is retrieved, it often needs to be transformed and filtered before being utilized. The prevailing method for this task is through the use of ...

Encountering an issue with Angular 13 routing where extraction of property fails when returning value as an observable

After receiving an id number from the parent component, I pass it to my child component in order to retrieve a value with multiple properties. To achieve this, I created a service that returns an observable containing the desired object. However, when atte ...