class-transformer用法/装饰器总结
Date:
根据官方文档:https://github.com/typestack/class-transformer
class-transformer的装饰器主要有:
装饰器名称 | 用途 |
---|---|
@Exclude | 排除属性,不参与序列化或反序列化 |
@Expose | 暴露属性,可配置别名或组 |
@Type | 指定属性的类型,用于嵌套对象或特定类型转换 |
@Transform | 自定义转换逻辑,应用函数处理值 |
@Groups | 分组控制属性的序列化/反序列化 |
使用案例:
import { Exclude } from "class-transformer";
class User {
@Transform(({ value }) => new Date(value), { toClassOnly: true }) // 仅反序列化时转换
birthDate: Date;
@Column({
type: "tinyint",
name: "private",
transformer: {
to: (value: boolean) => (value ? 1 : 0), // 在保存到数据库时,将 true 转换为 1,false 转换为 0
from: (value: number) => value === 1, // 从数据库读取时,将 1 转换为 true,0 转换为 false
},
})
private: boolean;
@Expose({ name: "user_id" }) // 序列化时字段名为 "user_id"
id: number;
@Expose({ groups: ["admin"] }) // 仅在 'admin' 分组中暴露
email: string;
@Exclude()
password: string; // 序列化和反序列化时均排除
@Type(() => Post)
posts: Post[]; // 将普通对象数组转换为 Post 实例数组
@Type(() => Date)
createdAt: Date; // 字符串转换为 Date 对象
}
// 类级别排除
@Exclude()
class SensitiveData {
token: string;
}
分组控制:通过 @Expose({ groups: [...] }) 实现按组暴露属性,需配合转换函数中的 groups 参数使用。
嵌套对象:必须使用 @Type 明确指定嵌套类型,否则转换结果为普通对象而非类实例。
日期处理:默认不会自动转换字符串为 Date 对象,需显式使用 @Type(() => Date) 或 @Transform。
起初我以为不加 Expose ,就不会返回给前端呀?
默认情况(无特殊配置):不加 @Expose,属性默认会返回给前端,除非显式用 @Exclude 排除。
启用 excludeExtraneousValues: true 时:必须加 @Expose,否则属性不会返回给前端。
那么如何启用excludeExtraneousValues,需要使用其函数
class Post {
@Expose({ groups: ['admin'] })
title: string;
@Expose({ until: 1 })// 仅 v1 生效
content: string;
}
const plainPost = { title: 'Secret', content: 'Hello' };
const post = plainToInstance(Post, plainPost, {
excludeExtraneousValues: true,//必须加 @Expose,否则属性不会返回给前端。
groups: ['admin'], // 只转换 'admin' 分组的属性
ersion: 1
});
console.log(post); // 输出 { title: 'Secret', content: 'Hello' }
class-transformer 有哪些api 可以使用呢?
函数名称 | 用途 | 示例 |
---|---|---|
plainToInstance(cls, plainObject, options?) (旧版:plainToClass) | 将普通对象转换为类实例(支持嵌套对象、数组、类型推断)。 | typescript<br>const user = plainToInstance(User, { id: 1, name: 'Alice' }); |
instanceToPlain(instance, options?) (旧版:classToPlain) | 将类实例转换为普通对象(根据装饰器配置序列化)。 | typescript<br>const plainUser = instanceToPlain(user); |
serialize(cls, object, options?) | 直接序列化对象为 JSON 字符串(等价于 JSON.stringify(instanceToPlain(...)))。 | typescript<br>const json = serialize(User, user); |
deserialize(cls, jsonString, options?) | 将 JSON 字符串反序列化为类实例(等价于 plainToInstance + JSON.parse)。 | typescript<br>const user = deserialize(User, '{"id":1,"name":"Alice"}'); |
transform(cls, plainObject, options?) | 高级转换函数,支持复杂类型转换(如递归处理嵌套对象、自定义转换逻辑)。 | typescript<br>const user = transform(User, { id: 1 }, { strategy: 'exposeAll' }); |
转载本站文章《class-transformer用法/装饰器总结》,
请注明出处:https://www.zhoulujun.cn/html/webfront/server/nestjs/9534.html
上一篇:第一页