![](/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.