2

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

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

例子:

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

我做错了什么?

4

1 回答 1

3

首先,什么是Request?我假设这会返回一个Promise.

你有几个问题:

  1. 你从来没有真正将你的反应映射到一个new UserResponse
  2. TypeScript 中的泛型不会产生的响应。它更像是interface一个数据契约,而不是一个完整的初始化类。

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

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);

基本上,您需要将 a 添加constructor到您的课程中(否则,只需使用 a interface)。获得 后constructor,您就可以从响应中新建一个新类。UserResponse

此外,如果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);

于 2020-02-23T22:59:02.990 回答