class-transformer的使用

2024-04-22 08:59:11 浏览数 (1)

class-transformerclass-transformer

上篇文章介绍了如何使用class-validator验证数据,接下来我们接着聊class-transformer的使用。

class-transformer直接翻译的意思就是类的转换,其实这里转换的不是类,而是对象,目的是将字面量对象转化为相应的类生成的对象,然后就可以使用class-validator验证了。

class-transformer本质上实现字面量对象plain object和类实例对象instance of class之间的转换,看如下代码:

首先我们来区分一下plain(literal) object和class(constructor) objects:

代码语言:typescript复制
 // literal
 const literralObj = {
   name: 'li',
   age: 18
 }
 // class
 class User {
   constructor(public name: string, public age: number){
     this.name = name
     this.age = age
   }
 }
 const user = new User('jing', 20)

plain(literal) object是通过{ ... }直接定义出来的,class(constructor) objects是通过类new出来的。

我们在前端处理后端传送过来的数据时,经过反序列化转换的对象全是plain(literal) object,如下:

代码语言:json复制
 {
   "id": 1,
   "firstName": "Johny",
   "lastName": "Cage",
   "age": 27
 },

我们在前端定义了User类:

代码语言:js复制
 export class User {
   id: number;
   firstName: string;
   lastName: string;
   age: number;
   
   getName() {
     return this.firstName   ' '   this.lastName;
   }
   
   isAdult() {
     return this.age > 36 && this.age < 60;
   }
 }

我们在前端接收数据的时候,可以使用ts语法显示标注接收对象的类型,可以给我们属性提示,但是我们没法使用User类给我们提供的方法!

代码语言:js复制
 fetch('user.json').then((user: User) => {
   // you can use user here, and type hinting also will be available to you,
   //  but user is not actually instance of User class
   // this means that you can't use methods of User class
   
   // error!
   user.getName()
   user.isAdult()
 });

如果我们想要相关的方法,那必须重建整个对象,复制对应的属性值,这对于一个复杂对象来说很麻烦,且是一件很容易出错的事,如果使用class-transform可以直接将收到的user字面量对象转换为User实例对象,进而可以使用其中的方法

代码语言:js复制
 fetch('user.json').then((user: Object) => {
   const realUsers = plainToClass(Use, user);
   // now user is an instance of User class
 });

以上便是class-transformer的使用,希望对你有所帮助

0 人点赞