class-transformer 用于 TypeScript:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

class-transformer 简介:它是什么以及为什么需要它

\n\n

class-transformer 是一个用于 TypeScript 和 JavaScript 的强大库,它允许将普通(plain)JavaScript 对象转换为类实例,反之亦然。它解决了一个根本性问题:当处理来自 API、数据库或 JSON 文件的数据时,您会得到没有方法和类型的简单对象。class-transformer 可以“激活”这些数据,将它们转化为具有验证、转换和序列化功能的完整类对象。

\n\n

主要使用场景:

\n
    \n
  • 将 API 的 JSON 转换为类型化的类对象 — 例如,在收到 REST API 的响应后,您可以自动将 JSON 转换为模型的实例。
  • \n
  • 数据验证和转换 — 使用装饰器可以指定哪些字段是必需的,哪些需要转换(例如,将字符串转换为数字或日期)。
  • \n
  • 将对象序列化为 JSON — 将类实例反向转换为简单对象,以便发送到客户端或保存。
  • \n
  • 处理嵌套对象和数组 — 该库能够递归地转换嵌套的数据结构。
  • \n
\n\n

class-transformer 通常与 class-validator(用于验证)以及流行的框架(如 NestJS、TypeORM 和 MikroORM)一起使用。

\n\n

安装

\n\n

通过 npm 或 yarn 安装该库:

\n\n
npm install class-transformer --save
\n\n

或者,如果您使用 yarn:

\n\n
yarn add class-transformer
\n\n

要在 TypeScript 中使用装饰器,您需要在 tsconfig.json 文件中启用对实验性装饰器的支持:

\n\n
{\n  "compilerOptions": {\n    "experimentalDecorators": true,\n    "emitDecoratorMetadata": true\n  }\n}
\n\n

还建议安装 reflect-metadata 以确保装饰器正常工作:

\n\n
npm install reflect-metadata --save
\n\n

并在应用程序的最开始处导入它(通常在主文件 index.ts 或 main.ts 中):

\n\n
import 'reflect-metadata';
\n\n

快速入门及代码示例

\n\n

让我们创建一个简单的用户模型,并将 JSON 数据转换为类实例。

\n\n
import { 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\n

class-transformer 的主要方法和函数

\n\n

1. plainToClass

\n

功能: 将一个或多个普通(plain)对象转换为类的实例

推荐