javascript - Hur man omvandlar svar från API-förfrågan till en klassinstans med `class-transformer` i TypeScript?
Jag har en normal metod Request(method: HttpMethod, url: string, ...) för att anropa API:et. Jag använder TypeScript.
Jag behöver omvandla svar från denna API-förfrågan till en klassinstans med class-transformer (eller utan det :D).
Exempel :
class UserResponse {
id: number;l
foo: string;
bar: string;
}
const user = await Request(HttpMEthod.GET, '/user/1');
// `user` should be class instance `UserResponse`
Jag vet att jag inte kan använda generics på det här sättet:
const Request = <T>(method: HttpMethod, url: string, ...) => {
// axios or something else...
return plainToClass(T, res);
}
const user = await Request<UserResponse>(HttpMEthod.GET, '/user/1');
Generics fungerar inte på det sättet, men jag kan göra något som:
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());
Men detta fungerar inte heller. Jag får fortfarande user-typ:
const user: unknown
Vad gör jag fel?
Svar #1
Först och främst, vad är Request? Jag antar att detta returnerar ett Promise.
Du har ett par problem:
- Du kartlägger aldrig faktiskt ditt svar till en
new UserResponse - Generics i TypeScript kommer inte att skapa ett nytt svar. Det fungerar mer som ett
interfacedär det är mer ett datakontrakt snarare än en fullständigt initierad klass.
Här är hur du behöver göra detta:
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);I princip behöver du lägga till en konstruktor till din klass (annars, använd bara ett interface). När du har fått konstruktorn kan du sedan skapa en ny UserResponse-klass från svaret.
Också, om Request ser ut så här:
const Request = <T>(method: HttpMethod, url: string, ..., transformTo?: { new (): T }) => {
// axios or something else...
return plainToClass(transformTo, res);
}
Jag tror att du vill göra detta istället: const user=await Request(HttpMEthod.GET, '/user/1', ... , UserResponse);
