Свойство `data` не существует для типа <void>| AxiosHttpResponse <any> - PullRequest
2 голосов
/ 26 марта 2019

У меня есть обещание, которое я использую для установки состояния, когда выбираю данные для конкретного пользователя.Ниже приведен код для этого:

getUserUsername = (): string => {
    const { match } = this.props;
    return match.params.username;
  };

  onFetchUser = () =>
    getUser(this.getUserUsername())
      .then(username => {
        if (this.hasBeenMounted) {
          this.setState({
            user: username.data // The error is here.
          });
        }
      })
      .catch((errorResponse: HttpResponseObj | null = null) => {
        if (this.hasBeenMounted) {
          this.setState({
            isLoading: false,
            user: null,
            errorMessage: errorResponse
          });
        }
      });

Но я получаю эту ошибку TS, говоря:

Property 'data' does not exist on type 'void | AxiosResponse<IUser>'.
  Property 'data' does not exist on type 'void'.ts(2339)
---
any

getUser(), это служба, которую я использую, и код для неездесь:

export const getUser = (username: string, initialOptions = {}): HttpResponse<IUser> => {
  const options = {
    method: httpMethod.GET,
    url: endpoint.GET_USER(username)
  };
  return Instance(options, lensesOptions);
};

Код для HttpResponse здесь:

export interface HttpResponse<T> extends Promise<void | AxiosResponse<T>> {}

Я попробовал что-то вроде:

      .then((username): HttpResponse<any> => { // Doesn't work though
        if (this.hasBeenMounted) {
          this.setState({
            user: username.data
          });
        }
      })

Вот интерфейс Axios:

export interface AxiosResponse<T = any>  {
  data: T;
  status: number;
  statusText: string;
  headers: any;
  config: AxiosRequestConfig;
  request?: any;
}

Подскажите, пожалуйста, в чем проблема.Я иду к Axios Interface и вижу его data, а также generic там нет проблем .. Спасибо !!

1 Ответ

2 голосов
/ 26 марта 2019

Вы должны проверить тип username, прежде чем пытаться использовать его, потому что функция возвращает два значения с разными свойствами (void и AxiosResponse)

Таким образом, вы должны проверить так:

  .then(username => {
    // Check if it is not void
    if (this.hasBeenMounted && username ) { 
      this.setState({
        user: username.data
      });
    }
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...