📖 Scenario: You are building a NestJS API that returns user data. You need to ensure sensitive fields like passwords are never sent in responses, and that incoming data is properly transformed into class instances with type coercion.
🎯 Goal: Use class-transformer decorators to control serialization of response data and enable automatic transformation of incoming request bodies in NestJS.
📋 What You'll Learn
Install class-transformer and enable transform in ValidationPipe
Create a DTO with @Expose and @Exclude decorators
Use @Transform for custom type conversion
Apply ClassSerializerInterceptor to strip excluded fields from responses
💡 Why This Matters
🌍 Real World
class-transformer is essential in NestJS for securing API responses by hiding sensitive data and ensuring incoming data is properly typed and validated.
💼 Career
Understanding serialization and transformation is a core NestJS skill for building secure, type-safe backend APIs.
Progress0 / 4 steps
1
Enable transformation in ValidationPipe
In main.ts, configure the global ValidationPipe with transform: true and whitelist: true so that incoming request bodies are automatically converted into DTO class instances.
NestJS
Hint
Use app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true })).
2
Create DTO with @Exclude decorator
Create a UserResponseDto class with properties id (number), name (string), email (string), and password (string). Use @Exclude() on the password property so it is never included in API responses.
NestJS
Hint
Place @Exclude() directly above the password property declaration.
3
Add @Transform for type conversion
Create a CreateEventDto class with a title (string) and a startDate property. Use @Transform() to automatically convert the incoming string date value into a JavaScript Date object.
NestJS
Hint
Use @Transform(({ value }) => new Date(value)) above the startDate property.
4
Apply ClassSerializerInterceptor
In your controller, use @UseInterceptors(ClassSerializerInterceptor) on the class so that all response objects are serialized through class-transformer, automatically stripping @Exclude() fields.
NestJS
Hint
Add @UseInterceptors(ClassSerializerInterceptor) above the controller class.
Practice
(1/5)
1. What is the main purpose of the class-transformer library in a NestJS application?
easy
A. To convert plain JavaScript objects into class instances and vice versa
B. To handle HTTP requests and responses
C. To manage database connections
D. To style the frontend components
Solution
Step 1: Understand the role of class-transformer
The library is designed to transform plain objects into instances of classes and back, which helps in managing data cleanly.
Step 2: Compare with other options
Options B, C, and A relate to other parts of NestJS or frontend, not data transformation.
Final Answer:
To convert plain JavaScript objects into class instances and vice versa -> Option A
Quick Check:
class-transformer = object-class conversion [OK]
Hint: Remember: class-transformer changes plain objects to class instances [OK]
Common Mistakes:
Confusing class-transformer with HTTP or database modules
Thinking it styles frontend components
Assuming it manages server routing
2. Which decorator from class-transformer is used to exclude a property from the transformed output?
easy
A. @Expose()
B. @Exclude()
C. @Transform()
D. @Type()
Solution
Step 1: Identify the decorator for exclusion
The @Exclude() decorator marks properties to be left out during transformation.
Step 2: Understand other decorators
@Expose() includes properties, @Transform() customizes transformation, and @Type() defines property types.
Final Answer:
@Exclude() -> Option B
Quick Check:
Exclude means leave out = @Exclude() [OK]
Hint: Exclude properties with @Exclude() decorator [OK]
Common Mistakes:
Using @Expose() to exclude instead of include
Confusing @Transform() with exclusion
Not importing decorators correctly
3. Given the following code, what will be the output of console.log(userTransformed)?
5. You want to transform a plain object with nested properties into class instances using class-transformer. Which approach correctly handles nested objects?
import { plainToInstance, Type } from 'class-transformer';
class Address {
street: string;
city: string;
}
class User {
name: string;
@Type(() => Address)
address: Address;
}
const plainUser = {
name: 'Bob',
address: { street: 'Main St', city: 'Townsville' }
};
const user = plainToInstance(User, plainUser);
console.log(user.address instanceof Address);
What will console.log output and why?
hard
A. undefined, because address property is missing
B. false, because nested objects are not transformed automatically
C. Error, because @Type decorator is used incorrectly
D. true, because @Type decorator converts nested object to Address instance
Solution
Step 1: Recognize the role of @Type decorator
The @Type(() => Address) decorator tells class-transformer to convert the nested plain object into an Address class instance.
Step 2: Check the output of instanceof
Since transformation happens correctly, user.address is an instance of Address, so the output is true.
Final Answer:
true, because @Type decorator converts nested object to Address instance -> Option D
Quick Check:
@Type enables nested class conversion = true [OK]
Hint: Use @Type(() => Class) for nested object transformation [OK]
Common Mistakes:
Forgetting @Type causes nested objects to stay plain
Assuming nested objects transform automatically
Misusing @Type decorator syntax
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.