上篇文章介绍了如何使用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的使用,希望对你有所帮助