Hello,

As axios automatically converts JSON responses could we get something like this:

```ts
get<T>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>;

export interface AxiosPromise<T> extends Promise<AxiosResponse<T>> {
}

export interface AxiosResponse<T> {
  data: T;
  status: number;
  statusText: string;
  headers: any;
  config: AxiosRequestConfig;
}
```
test/typescript/axios.ts
const fn2: (arr: number[]) => string = axios.spread(fn1);
axios.get('/user')
  .then((response: AxiosResponse) => 'foo')
  .then((value: string) => {});
axios.get('/user')
  .then((response: AxiosResponse) => Promise.resolve('foo'))
  .then((value: string) => {});
axios.get('/user')
  .then((response: AxiosResponse) => 'foo', (error: any) => 'bar')
  .then((value: string) => {});
axios.get('/user')
  .then((response: AxiosResponse) => 'foo', (error: any) => 123)
  .then((value: string | number) => {});
axios.get('/user')
  .catch((error: any) => 'foo')
  .then((value: string) => {});
axios.get('/user')
  .catch((error: any) => Promise.resolve('foo'))
  .then((value: string) => {});
const source: CancelTokenSource = axios.CancelToken.source();
axios.get('/user', {
  cancelToken: source.token
}).catch((thrown: AxiosError | Cancel) => {
  if (axios.isCancel(thrown)) {
    const cancel: Cancel = thrown;
    console.log(cancel.message);
  }
});
source.cancel('Operation has been canceled.');