介绍
在开发API的时候,发现类对象的定义中写了一个拼写@Expose(),所以决定去看看。
过去我还写了一篇关于 class-transformer 的概述。
plainToClass() 函数
首先,假设您有一个关联数组 users(以普通对象作为元素)和一个自定义 User 类。
索引.ts
import { plainToClass } from "class-transformer";
const users = [
{
id: 1,
firstName: "Johny",
lastName: "Cage",
age: 27,
},
{
id: 2,
firstName: "Ismoil",
lastName: "Somoni",
age: 50,
},
{
id: 3,
firstName: "Luke",
lastName: "Dacascos",
age: 12,
},
];
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;
}
}
const realUsers = plainToClass(User, users);
console.log(realUsers[0].age, realUsers[0].isAdult(), realUsers[0].getName());
// 27 false Johny Cage
通过将关联数组 users 转换为 User 类,您不仅可以使用类的属性,还可以使用方法。
plainToClass() 函数的默认行为问题
索引.ts
import { plainToClass } from 'class-transformer';
class User {
id: number;
firstName: string;
lastName: string;
}
const fromPlainUser = {
unknownProp: 'hello there',
firstName: 'Umed',
lastName: 'Khudoiberdiev',
};
console.log(plainToClass(User, fromPlainUser));
// User {
// unkownProp: 'hello there',
// firstName: 'Umed',
// lastName: 'Khudoiberdiev',
// }
但默认情况下plainToClass() 函数继承普通对象fromPlainUser 的所有属性。不在@类中的User属性被覆盖,在User类中的id属性也被删除。
这里的问题是“我想在一定程度上保证类型的同时进行转换”。
Expose() 用于类型安全的实例化
为了解决上述默认行为的问题,我们可以不继承普通对象的所有属性,而是添加excludeExtraneousValues选项,以消除转换后不必要的属性增加。
索引.ts
import { Expose, plainToClass } from 'class-transformer';
class User {
@Expose() id: number;
@Expose() firstName: string;
@Expose() lastName: string;
}
const fromPlainUser = {
unkownProp: 'hello there',
firstName: 'Umed',
lastName: 'Khudoiberdiev',
};
console.log(plainToClass(User, fromPlainUser, { excludeExtraneousValues: true }));
// User {
// id: undefined,
// firstName: 'Umed',
// lastName: 'Khudoiberdiev'
// }
这里,对于输出结果中你想要的属性,需要在定义User类时提前声明@Expose()。
在最后
我通过查看我作为实习生在工作中经常接触的源代码,对我不知道的东西做了一个备忘录。我们很高兴分享这个学习。
参考
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308629115.html