![](/img/trans.png)
[英]How to convert typescript class to plain javascript object with class-transformer
[英]How to transform response from API request into class instance with `class-transformer` in TypeScript?
我有用于调用 API 的普通方法Request(method: HttpMethod, url: string, ...)
。 我正在使用打字稿。
我需要使用class-transformer
(或没有它:D)将来自此 API 请求的响应转换为类实例。
例子:
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
? 我假设这会返回一个Promise
。
你有几个问题:
new UserResponse
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);
基本上,您需要向类中添加一个constructor
(否则,只需使用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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.