Appearance
class-transformer
给大家介绍两个基于reflect-metadata元数据实现的比较有用的功能库
class-transformer可以很方便的将普通对象转换为类的某些实例,这个功能在某一些时候非常好用。
比如我们在很多时候,从后端获取的数据,都是一些简单的json格式的数据,有些数据可能需要经过前端的再处理,如下:
json
{
"id": 1,
"firstName": "Nancy",
"lastName": "Lopez",
"age": 35
}为了简单方便,可以使用远程的mock模拟数据,比如easy mock,直接简单登录之后即可使用,使用过程就两步:
1、创建项目
2、创建接口
再复杂一点的时候可以自己去阅读网站的文档
我们可以创建如下的简单数据
json
{
code: 200,
"data|10": [{
"id|+1": 1,
"firstName": "@first",
"lastName": "@last",
"age|9-45": 1
}],
msg: "成功"
}从后端获取的是上面的数据,可能前端还需要一些功能,比如获取全名,比如判断是否成年,我们可以创建一个类进行封装处理
typescript
class User {
id: number
firstName: string
lastName: string
age: number
getFullName() {
return this.firstName + " "+ this.lastName;
}
isAdult() {
return this.age > 18 ? "成年人" : "未成年人";
}
}
// 模拟数据返回格式
interface Result<T> {
code: number;
data: T;
msg: string
}这在我们获取数据的时候,如果直接获取的就是简单json数据,倒是没什么影响,但是不能访问自己封装的函数
typescript
fetch("https://mock.mengxuegu.com/mock/65b1f3d1c4cd67421b34cd0c/mock_ts/list")
.then(res => res.json())
.then( (res:Result<User[]>) => {
console.log(res.code);
console.log(res.msg);
const users = res.data;
for (const u of users) {
console.log(u.id + " " + u.firstName);
// console.log(u.id + " " + u.getFullName() + " " + u.isAdult()); //error
}
})这里,就可以使用class-transformer它可以自动的将数据和我们封装的类进行映射,使用也非常的简单
typescript
import "reflect-metadata"
import { plainToInstance } from 'class-transformer';
fetch("https://mock.mengxuegu.com/mock/65b1f3d1c4cd67421b34cd0c/mock_ts/list")
.then(res => res.json())
.then( (res:Result<User[]>) => {
console.log(res.code);
console.log(res.msg);
const users = res.data;
const us = plainToInstance(User, users);
for (const u of us) {
// console.log(u.id + " " + u.firstName);
console.log(u.id + " " + u.getFullName() + " " + u.isAdult());
}
})这样就正常的获取了User类所修饰的内容
class-validator
这个库同样是基于reflect-metadata元数据实现的比较有用的功能库,通过名字大家就知道,这个库可以用来对类进行验证
这个库使用也非常的简单,基本也就知晓两步就ok
1、相关装饰器的绑定
2、验证方法的调用
typescript
import "reflect-metadata";
import { validate, IsNotEmpty, Length, Min, Max, IsPhoneNumber } from "class-validator";
class User {
@IsNotEmpty({ message: "账号不能为空" })
@Length(3, 5, { message: "账号必须是3-5个字符" })
loginId: string;
@Min(9)
@Max(45)
age: number;
@IsPhoneNumber("CN")
tel: string;
}
const u = new User();
validate(u).then(errors => {
console.log(errors)
})