effect_tw
@effect_tw

Как работает типизация в данном случае?

Есть код , обращение на бэкенд с помощью библиотеки axios.
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. Он принимает два дженерика. Мы передаем один, и в то же время, дженерику R - дефолтно присваиваем тип в который прокидываем дженерик T. т.е по сути мы при описании типов для ф-ции , в этом месте 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;
}
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
bingo347
@bingo347
Ткнуть в доку лучше готового к копипасте ответа
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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы