【NestJS】class-transformer什么用
🧩 一句话总结
class-validator
负责校验数据,class-transformer
负责把数据“变形”。
前者管“对不对”,后者管“长什么样”。
🚀 1. 它的主要功能
(1)请求数据的反序列化(plain → class)
在进入控制器之前,Nest 的 ValidationPipe
会:
- 先用
class-transformer
把plain object
(比如前端传来的 JSON)转换为指定的 DTO 类实例; - 然后再交给
class-validator
去校验。
💡 举例来说:
前端传来{ age: '18' }
DTO 里写的是@Type(() => Number) age: number
那么它会帮你自动转成{ age: 18 }
(数字),再去校验。
示例:
import { Type } from 'class-transformer';
import { IsInt, Min } from 'class-validator';export class CreateUserDto {@Type(() => Number) // 👈 转换字符串为数字@IsInt()@Min(1)age: number;
}
✅ 作用:避免前端传
"1"
时被当作字符串校验错误。
(2)响应数据的序列化(class → plain)
当你返回一个类实例时,class-transformer
能帮你过滤、隐藏或格式化返回字段。
比如你不想返回密码字段:
import { Exclude, Expose } from 'class-transformer';export class UserEntity {id: number;username: string;@Exclude() // 👈 不会出现在响应中password: string;@Expose()get profileUrl() {return `/users/${this.id}`;}
}
在控制器中:
@Get(':id')
getUser() {return plainToInstance(UserEntity, userFromDB);
}
返回结果自动是:
{"id": 1,"username": "Alice","profileUrl": "/users/1"
}
🧠 2. 它与 class-validator 的关系
功能项 | class-transformer | class-validator |
---|---|---|
是否验证字段 | ❌ 否 | ✅ 是 |
是否改变数据类型 | ✅ 是 | ❌ 否 |
是否生成类实例 | ✅ 是 | ❌ 否 |
是否用于响应输出 | ✅ 是 | ❌ 否 |
是否和 ValidationPipe 联动 | ✅ 是(transform 开启) | ✅ 是 |
在 NestJS 里,这两者经常配合使用,例如:
app.useGlobalPipes(new ValidationPipe({transform: true, // 👈 开启 class-transformerwhitelist: true,}),
);
这行代码会让:
- Nest 自动把请求 JSON 转成 DTO 实例;
- 自动类型转换(如果有
@Type
); - 校验时不包含多余字段。
🔍 3. 为什么在 Zod 架构中就不用它了?
因为 Zod 自带类型推导和运行时验证,数据类型转换和结构校验可以直接在 schema 内完成,不再需要 class + 装饰器的方式。
比如👇
Zod 直接定义好类型、默认值、转换逻辑:
const LoginSchema = z.object({username: z.string().min(1),age: z.preprocess(val => Number(val), z.number().int().min(1)),
});
这里 z.preprocess
的功能就相当于 class-transformer
的 @Type(() => Number)
。
✅ 所以在 Zod 架构中,不再依赖 class-transformer,整个 DTO 就可以删掉。
🧩 4. 总结一下
对比点 | class-transformer 作用 | 是否在 Zod 中仍需 |
---|---|---|
请求参数类型转换 | 把字符串转数字、日期等 | ❌(Zod 内部可做) |
响应数据隐藏字段 | @Exclude、@Expose | ✅(可用自定义函数代替) |
类实例创建 | plain → class | ❌(Zod 直接校验对象) |
Swagger 类型推断 | 依赖装饰器 | ❌(Zod → OpenAPI 替代) |
💬 一句话收尾
class-transformer
是旧架构的“形态塑造器”,让前端传的 plain 数据符合 DTO 形状;
在 Zod 架构下,它的功能被 Schema 内部的类型系统自然取代。