class-tranform详解

478 阅读2分钟

class-transformer是什么?

示例:
假设你有一个用户类(User)和一组JSON格式的用户数据。class-transformer可以帮你将这些普通对象转换为User的类实例。

import { plainToClass } from 'class-transformer';

class User {
  id: number;
  firstName: string;
  lastName: string;
  
  getName() {
    return this.firstName + ' ' + this.lastName;
  }
}
let userJson = [
  { "id": 1, "firstName": "Johny", "lastName": "Cage" },
  // ...更多用户
];
let users = plainToClass(User, userJson);
console.log(users[0].getName()); // 现在可以调用getName方法

安装

  • 在Node.js中安装:
npm install class-transformer --save
npm install reflect-metadata --save

然后在应用的全局位置导入reflect-metadata:

import 'reflect-metadata';

方法

  • plainToClass:
    将普通对象转换为特定类的实例。

示例:

import { plainToClass } from 'class-transformer';

let users = plainToClass(User, userJson);
  • classToPlain:
    将类对象转换回普通JavaScript对象。

示例:

import { classToPlain } from 'class-transformer';

let plainUser = classToPlain(users[0]);
  • 其他方法如instanceToInstance、serialize、deserialize等,均有类似的用法。

4. 类型安全实例

可以使用excludeExtraneousValues选项在转换时排除不是类定义的属性。

示例:

import { plainToClass, Expose } from 'class-transformer';

class User {
  @Expose()
  id: number;
  @Expose()
  firstName: string;
  @Expose()
  lastName: string;
}

const fromPlainUser = plainToClass(User, userJson, { excludeExtraneousValues: true });

处理嵌套对象

可以使用@Type装饰器来指明嵌套对象的类型,以确保正确地转换。

示例:

import { Type } from 'class-transformer';

class Album {
  @Type(() => Photo)
  photos: Photo[];
}

跳过属性

您可以使用@Exclude装饰器来跳过转换过程中不需的属性。

示例:

import { Exclude } from 'class-transformer';

class User {
  id: number;
  name: string;
  
  @Exclude()
  password: string;
}

分组和版本管理

使用@Expose装饰器和分组可以控制哪些数据被公开。

示例:

import { Expose } from 'class-transformer';

class User {
  id: number;
  
  @Expose({ groups: ['admin'] })
  secret: string;
}

日期和集合转换

可以处理字符串中的日期以及SetMap等ES6集合。

示例:

import { Type } from 'class-transformer';

class Player {
  @Type(() => Date)
  lastLogin: Date;
}

**

其他装饰器

使用@Transform装饰器对数据进行额外的转换。

示例:

import { Transform } from 'class-transformer';
import moment from 'moment';

class Photo {
  @Transform(({ value }) => moment(value), { toClassOnly: true })
  uploadDate: moment.Moment;
}

总结

class-transformer为TypeScript项目提供了健壮的类和对象转换工具。其支持的详细功能和方法能够帮助开发者在前后端对数据结构进行有效地转换以满足业务需求。