• home > webfront > server > NestJS >

    class-transformer用法/装饰器总结

    Date:

    默认情况(无特殊配置):不加 @Expose,属性默认会返回给前端,除非显式用 @Exclude 排除!启用 excludeExtraneousValues: true 时:必须加 @Expose,否则属性不会返回给前端。

    根据官方文档: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), { toClassOnlytrue }) // 仅反序列化时转换
      birthDateDate;
    
      @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
        },
      })
      privateboolean;
    
      @Expose({ name"user_id" }) // 序列化时字段名为 "user_id"
      idnumber;
      @Expose({ groups: ["admin"] }) // 仅在 'admin' 分组中暴露
      emailstring;
      @Exclude()
      passwordstring// 序列化和反序列化时均排除
    
      @Type(() => Post)
      postsPost[]; // 将普通对象数组转换为 Post 实例数组
    
      @Type(() => Date)
      createdAtDate// 字符串转换为 Date 对象
    }
    
    // 类级别排除
    @Exclude()
    class SensitiveData {
      tokenstring;
    }


    • 分组控制:通过 @Expose({ groups: [...] }) 实现按组暴露属性,需配合转换函数中的 groups 参数使用。

    • 嵌套对象:必须使用 @Type 明确指定嵌套类型,否则转换结果为普通对象而非类实例。

    • 日期处理:默认不会自动转换字符串为 Date 对象,需显式使用 @Type(() => Date) 或 @Transform。

    起初我以为不加 Expose ,就不会返回给前端呀?

    默认情况(无特殊配置):不加 @Expose,属性默认会返回给前端,除非显式用 @Exclude 排除

    启用 excludeExtraneousValues: true 时:必须加 @Expose,否则属性不会返回给前端。

    那么如何启用excludeExtraneousValues,需要使用其函数

    class Post {
      @Expose({ groups: ['admin'] })
      title: string;
    
      @Expose({ until1 })// 仅 v1 生效
      content: string;
    }
    
    const plainPost = { title: 'Secret', content: 'Hello' };
    const post plainToInstance(Post, plainPost, {
      excludeExtraneousValuestrue,//必须加 @Expose,否则属性不会返回给前端。
      groups: ['admin'], // 只转换 'admin' 分组的属性
      ersion1
    });
    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

    TOP