如何使用 TypeScript 中的“class-transformer”将来自 API 请求的响应转换为 class 实例?

How to transform response from API request into class instance with `class-transformer` in TypeScript?

我有调用 API 的正常方法 Request(method: HttpMethod, url: string, ...)。我正在使用 TypeScript。

我需要将此 API 请求的响应转换为带有 class-transformer(或不带它 :D)的 class 实例。

示例:

class UserResponse {
  id: number;l
  foo: string;
  bar: string;
}
const user = await Request(HttpMEthod.GET, '/user/1');
// `user` should be class instance `UserResponse`

我知道我不能像这样使用泛型:

const Request = <T>(method: HttpMethod, url: string, ...) => {
  // axios or something else...
  return plainToClass(T, res);
}

const user = await Request<UserResponse>(HttpMEthod.GET, '/user/1');

泛型不是那样工作的,但我可以这样做:

const Request = <T>(method: HttpMethod, url: string, ...,  transformTo?: { new (): T }) => {
  // axios or something else...
  return plainToClass(transformTo, res);
}

const user = await Request(HttpMEthod.GET, '/user/1', ... , new UserResponse());

但这也行不通。我仍然收到 user 类型:

const user: unknown

我做错了什么?

首先,什么是Request?我假设这个 returns a Promise.

您有几个问题:

  1. 您从未真正将您的回复映射到 new UserResponse
  2. TypeScript 中的泛型不会新建 响应。它更像是一个 interface,它更像是一个数据契约,而不是一个完全初始化的 class。

这是您需要执行此操作的方法:

class UserResponse {
  public id: number;
  public foo: string;
  public bar: string;
  constructor(user: UserResponse) {
    Object.assign(this, user); // or set each prop individually
  }
}
const response = await Request(HttpMEthod.GET, '/user/1');
const user = new UserResponse(response);

基本上,您需要在 class 中添加一个 constructor(否则,只需使用一个 interface)。获得 constructor 后,您可以从响应中 新建 一个新的 UserResponse class。

此外,如果 Request 看起来像:

const Request = <T>(method: HttpMethod, url: string, ...,  transformTo?: { new (): T }) => {
  // axios or something else...
  return plainToClass(transformTo, res);
}

我想你想这样做: const user = await Request(HttpMEthod.GET, '/user/1', ... , UserResponse);