typescript - Spesifiser Axios-responsstype på POST-forespørsel med kropp


Jeg prøver å spesifisere både JSON-bodyen og responstypen (som er forskjellige, noen prøver der ute har på en eller annen måte det samme for begge).

Feilmelding:

Argument av typen '{ grant_type: string; refresh_token: string; }' kan ikke tilordnes parameteren av typen 'AuthResponse'.
Objektliteralen kan bare spesifisere kjente egenskaper, og 'grant_type' finnes ikke i typen 'AuthResponse'.

Her er svaret jeg definerte som min type:

export interface AuthResponse {
  token: string;
  token_type: string;

  access_token: string;
  access_token_expires_at: string;

  refresh_token: string;
  refresh_token_expires_at: string;
}

Bruk 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 er av typen {grant_type: ..., refresh_token: ...} i stedet for AuthResponse.

Fra de enkle JS-eksemplene er data kroppen for forespørselen, men jeg er ikke sikker på hvorfor det skulle bli tvunget til å være det samme for responsen, så jeg må gjøre noe veldig feil.

Rediger/Svar: Som påpekt i @jrsharpe sitt innlegg, er dette EN feil, de har også nettopp gitt ut v0.23.0 for noen timer siden. Den fikser bug #4116. Så bare oppgrader til 0.23.0+.

Svar #1

du kan skrive begge slik

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

}

Relaterte artikler