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

}

Relaterade artiklar