interface ResponseApi {
status: string;
data: any;
}
async signIn(postData: LoginFormProps): Promise<ResponseApi> {
const { data } = await axios.post<ResponseApi>('/auth/login', {
username: postData.email,
password: postData.password,
});
return data;
},
post<T = any, R = AxiosResponse<T>>
создаем контекст из Дженериков , который можем везде использовать, и даже в ответе "Promise:"R";" . Правильно ли я понимаю?. p.s в учебнике таких примеров не былоpost<T = any, R = AxiosResponse<T>>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R>;
export interface AxiosResponse<T = any> {
data: T;
status: number;
statusText: string;
headers: any;
config: AxiosRequestConfig;
request?: any;
}
post<T = any, R = AxiosResponse<T>>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R>;
Оба дженерика имеют типы по умолчанию, а значит если их не указать именно они и будут использоватьсяaxios.post<ResponseApi>(/* ... */)
мы явно указываем, что T
- это тип ResponseApi
, а R берется по умолчанию, то есть AxiosResponse<T>
, что в нашем случае соответствует AxiosResponse<ResponseApi>
, а если и дальше развернуть, то выходит, что R
- это{
data: ResponseApi;
status: number;
statusText: string;
headers: any;
config: AxiosRequestConfig;
request?: any;
}
он и попадает в возвращаемый тип, обернутый в Promise, но TS знает про поведение await и деструктуризации, а следовательно без проблем вычисляет тип для data
- ResponseApi