如何使用 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
.
您有几个问题:
- 您从未真正将您的回复映射到
new UserResponse
- 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);
我有调用 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
.
您有几个问题:
- 您从未真正将您的回复映射到
new UserResponse
- 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);