J'essaie d'écrire des types autour d'un client de l'API Axios mais je ne comprends pas la bonne façon d'indiquer au compilateur le type de retour que j'attends.
Un exemple simplifié :
import axios, { AxiosResponse } from "axios";
interface BaseApiResponse extends AxiosResponse { }
interface ApiCollectionResponse<T> extends BaseApiResponse {
data: T[]
meta: {
totalCount: number
totalPages: number
}
}
interface ApiResourceResponse<T> extends BaseApiResponse {
data: T
}
type ApiResponse<T> = ApiCollectionResponse<T> | ApiResourceResponse<T>
const apiAction = <T>(url: string, onSuccess: (response: ApiResponse<T>) => void) => {
axios
.request({ url })
.then(({ data }) => {
onSuccess(data)
})
}
interface User {
name: string
}
const loadUsers = () =>
apiAction<User>('/users', (data) => alert(data.meta.totalCount))
Les données de réponse peuvent être soit un ApiCollectionResponse
o un ApiResourceResponse
. Le compilateur se plaint à juste titre que la propriété meta
n'existe pas sur le site ApiResourceResponse
l'interface.
Comment exprimer que cet appel à apiAction
se traduira par un ApiCollectionResponse
valeur de retour ?