介绍

在开发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

相关文章: