Class-Transformer库介绍

在前后端分离开发的过程中,前端开发人员如果想要避免因为接口字段不同造成效率下降的问题,就需要将后端传递的plainText中的字段进行转化。显然这里是在应用层面上使用了适配器模式。本文介绍一个js库实现对象字段名的转化功能。

1. Class-Transformer基本使用步骤

Class-Transformer是一个用于转换类实例的库,主要用于在对象之间进行数据映射。以下是使用Class-Transformer的基本步骤:

1.1 安装Class-Transformer

通过npm或yarn安装Class-Transformer库:

bash 复制代码
npm install class-transformer

bash 复制代码
yarn add class-transformer

1.2 创建类实体

定义需要进行转换的类实体,例如:

typescript 复制代码
// user.entity.ts
import { Expose } from 'class-transformer';

export class UserEntity {
  @Expose()
  id: number;

  @Expose()
  name: string;

  @Expose()
  email: string;
}

1.3 进行转换

在需要进行转换的地方,使用classToPlainplainToClass方法进行对象的转换:

typescript 复制代码
// main.ts
import { classToPlain, plainToClass } from 'class-transformer';
import { UserEntity } from './user.entity';

const userObject = {
  id: 1,
  name: 'John Doe',
  email: 'john@example.com',
};

// 转换为UserEntity实例
const userInstance = plainToClass(UserEntity, userObject);

// 转换为普通JavaScript对象
const plainObject = classToPlain(userInstance);

2. Class-Transformer高级使用技巧

2.1 字段别名

通过@Expose装饰器设置字段的别名,用于在转换时更改字段名称:

typescript 复制代码
// user.entity.ts
import { Expose } from 'class-transformer';

export class UserEntity {
  @Expose({ name: 'userID' })
  id: number;

  @Expose({ name: 'fullName' })
  name: string;

  @Expose()
  email: string;
}

2.2 转换嵌套对象

Class-Transformer支持转换嵌套对象,使用@Type装饰器指定嵌套对象的类型:

typescript 复制代码
// user.entity.ts
import { Expose, Type } from 'class-transformer';
import { RoleEntity } from './role.entity';

export class UserEntity {
  @Expose()
  id: number;

  @Expose()
  name: string;

  @Expose()
  email: string;

  @Type(() => RoleEntity)
  @Expose()
  roles: RoleEntity[];
}

3. Class-Transformer在前后端通信中的字段转换功能

Class-Transformer在前后端通信中的字段转换功能主要体现在处理后端返回的数据或前端发送的数据时,通过定义类实体并使用转换方法,实现字段名称的映射。在使用axios进行网络请求时,我们可以在处理后端返回的数据时应用Class-Transformer进行字段转换。

举例说明

假设我们有一个后端API返回的用户信息如下:

json 复制代码
{
  "user_id": 1,
  "full_name": "John Doe",
  "email_address": "john@example.com"
}

而前端希望使用以下UserEntity类表示用户信息:

typescript 复制代码
// user.entity.ts
import { Expose } from 'class-transformer';

export class UserEntity {
  @Expose({ name: 'user_id' })
  id: number;

  @Expose({ name: 'full_name' })
  name: string;

  @Expose({ name: 'email_address' })
  email: string;
}

如果使用的是js的话那就是:

js 复制代码
const { plainToClass, Transform, Expose } = require('class-transformer');

class UserEntity {
  @Expose({ name: 'user_id' })
  id;

  @Expose({ name: 'full_name' })
  name;

  @Expose({ name: 'email_address' })
  email;
}

接下来,在前端进行网络请求时,可以使用axios获取后端返回的用户信息,并应用Class-Transformer进行字段转换:

typescript 复制代码
// user.service.ts
import axios from 'axios';
import { plainToClass } from 'class-transformer';
import { UserEntity } from './user.entity';

export async function getUserInfo(userId: number): Promise<UserEntity> {
  try {
    const response = await axios.get(`/api/user/${userId}`);
    
    // 后端返回的数据进行字段转换为UserEntity实例
    const userEntity = plainToClass(UserEntity, response.data);

    return userEntity;
  } catch (error) {
    console.error('Error fetching user info:', error);
    throw error;
  }
}

在这个例子中,getUserInfo函数使用axios获取后端返回的用户信息,然后通过Class-Transformer的plainToClass方法将后端返回的数据转换为前端定义的UserEntity实例,实现了字段名称的映射。这样,在前端业务逻辑中,我们可以直接使用UserEntity类表示用户信息,而不必关心后端返回的原始字段名称。这种映射关系的定义可以使前后端在数据传递时更加灵活和可维护。

相关推荐
旧梦星轨4 小时前
掌握 Vite 环境配置:从 .env 文件到运行模式的完整实践
前端·前端框架·node.js·vue·react
qq_348231856 小时前
面向初学者到进阶者的 Node.js 学习指南
node.js
大猫和小黄6 小时前
Windows 下使用 NVM 管理多个 Node.js 版本
windows·node.js
Chase_______6 小时前
【保姆级】Node.js 最新安装教程,附环境变量配置
node.js
WangHappy21 小时前
出海不愁!用Vue3 + Node.js + Stripe实现全球支付
前端·node.js
该用户已不存在21 小时前
Node.js后端开发必不可少的7个核心库
javascript·后端·node.js
小邋遢2.01 天前
vscod 执行npm build报错:Error: Cannot find module ‘vite‘
前端·npm·node.js
孟陬1 天前
2025-12-11 之后前端 npm 如何发包 How to Publish NPM Package in Year 2025
npm·node.js·bun
五月君_1 天前
Node.js 历史性一刻!原生 TS 支持正式 Stable,告别 ts-node
node.js
五月君_1 天前
Node.js 企业级框架 Egg 4.0 发布:原生支持 AI 开发,架构全面革新
人工智能·架构·node.js