typescript - Ange Axios-svarstyp på POST-förfrågan med kropp
Jag försöker specificera både JSON-kroppen och svarstypen (som är olika, några exempel där ute har på något sätt samma för båda).
Felmeddelande:
Argument av typen '{ grant_type: string; refresh_token: string; }' kan inte tilldelas parametern av typen 'AuthResponse'.
Objektliteral kan endast specificera kända egenskaper, och 'grant_type' finns inte i typen 'AuthResponse'.
Här är svaret jag definierade som min typ:
export interface AuthResponse {
token: string;
token_type: string;
access_token: string;
access_token_expires_at: string;
refresh_token: string;
refresh_token_expires_at: string;
}
Användning av axios:
axios
.post<AuthResponse>(
secrets.authURL,//Defined in enclosing class
{
grant_type: this.grantType,//Defined in enclosing class
refresh_token: this.authPayload,//Defined in enclosing class
},//<-- Defined as data and conflicts with AuthResponse
{
headers: {
Authorization: this.getAuthHeader(),//Defined in enclosing class
"Content-Type": this.contentType,///Defined in enclosing class
},
}
)
.then((axiosResp) => {
const response = axiosResp.data;//<-- Not the type I'd expect
});
axiosResp.data är av typen {grant_type: ..., refresh_token: ...} istället för AuthResponse.
Från de enkla JS-exemplen är data kroppen för förfrågan, men jag är inte säker på varför det skulle tvingas vara samma för svaret, så jag måste göra något väldigt fel.
Redigera/Svara: Som påpekats i @jrsharpe's kommentar, detta ÄR en bugg, de släppte också precis v0.23.0 för några timmar sedan. Den fixar bug #4116. Så uppgradera bara till 0.23.0+.
Svar #1
du kan skriva båda så här
interface AuthResponse {
token: string;
token_type: string;
access_token: string;
access_token_expires_at: string;
refresh_token: string;
refresh_token_expires_at: string;
}
interface TBody {
grant_type: string
refresh_token: string
}
const t = async (): Promise<void> => {
const data = await axios.post<AuthResponse, AxiosResponse<AuthResponse, TBody>, TBody>("theurl", {
grant_type: 'kjkjk',
refresh_token: "dddf",
}, {
headers: {
Authorization: "dfdfds",
"Content-Type": "application/json",
},
})
const resu: AuthResponse = data.data
}
