class-transformer 简介:它是什么以及为什么需要它
\n\nclass-transformer 是一个用于 TypeScript 和 JavaScript 的强大库,它允许将普通(plain)JavaScript 对象转换为类实例,反之亦然。它解决了一个根本性问题:当处理来自 API、数据库或 JSON 文件的数据时,您会得到没有方法和类型的简单对象。class-transformer 可以“激活”这些数据,将它们转化为具有验证、转换和序列化功能的完整类对象。
\n\n主要使用场景:
\n- \n
- 将 API 的 JSON 转换为类型化的类对象 — 例如,在收到 REST API 的响应后,您可以自动将 JSON 转换为模型的实例。 \n
- 数据验证和转换 — 使用装饰器可以指定哪些字段是必需的,哪些需要转换(例如,将字符串转换为数字或日期)。 \n
- 将对象序列化为 JSON — 将类实例反向转换为简单对象,以便发送到客户端或保存。 \n
- 处理嵌套对象和数组 — 该库能够递归地转换嵌套的数据结构。 \n
class-transformer 通常与 class-validator(用于验证)以及流行的框架(如 NestJS、TypeORM 和 MikroORM)一起使用。
\n\n安装
\n\n通过 npm 或 yarn 安装该库:
\n\nnpm install class-transformer --save\n\n或者,如果您使用 yarn:
\n\nyarn add class-transformer\n\n要在 TypeScript 中使用装饰器,您需要在 tsconfig.json 文件中启用对实验性装饰器的支持:
{\n "compilerOptions": {\n "experimentalDecorators": true,\n "emitDecoratorMetadata": true\n }\n}\n\n还建议安装 reflect-metadata 以确保装饰器正常工作:
\n\nnpm install reflect-metadata --save\n\n并在应用程序的最开始处导入它(通常在主文件 index.ts 或 main.ts 中):
import 'reflect-metadata';\n\n快速入门及代码示例
\n\n让我们创建一个简单的用户模型,并将 JSON 数据转换为类实例。
\n\nimport { plainToClass, Expose, Type } from 'class-transformer';\nimport 'reflect-metadata';\n\n// 定义 User 类\nclass User {\n @Expose()\n id: number;\n\n @Expose()\n firstName: string;\n\n @Expose()\n lastName: string;\n\n @Expose()\n @Type(() => Date)\n createdAt: Date;\n\n // 类方法 — 仅在转换后可用\n getFullName(): string {\n return `${this.firstName} ${this.lastName}`;\n }\n}\n\n// 来自 API 的示例数据(plain object)\nconst plainUser = {\n id: 1,\n firstName: '伊万',\n lastName: '彼得罗夫',\n createdAt: '2024-01-15T10:30:00Z'\n};\n\n// 将 plain object 转换为 User 类的实例\nconst userInstance = plainToClass(User, plainUser);\n\nconsole.log(userInstance instanceof User); // true\nconsole.log(userInstance.getFullName()); // "伊万 彼得罗夫"\nconsole.log(userInstance.createdAt); // Date 对象: Tue Jan 15 2024 13:30:00 GMT+0300\n\n\n如您所见,我们得到了一个完整的类对象,包含方法和正确转换的类型(日期字符串变成了 Date 对象)。
\n\nclass-transformer 的主要方法和函数
\n\n1. plainToClass
\n功能: 将一个或多个普通(plain)对象转换为类的实例