Javascript axios的防御类型问题

Javascript axios的防御类型问题,javascript,generics,typescript,axios,definitelytyped,Javascript,Generics,Typescript,Axios,Definitelytyped,我已经安装了带有npm和打字的axios 现在,要在TypeScript中使用它,我需要向它传递一个type(T)。问题是,这个T同时用于请求接口和响应接口,这没有任何意义,因为服务器显然不返回它接收的相同类型的数据 interface ServerRepsonse { userID: string; } interface ServerRequest { username: string; password: string; } var body = {

我已经安装了带有npm和打字的axios

现在,要在TypeScript中使用它,我需要向它传递一个type(T)。问题是,这个T同时用于请求接口和响应接口,这没有任何意义,因为服务器显然不返回它接收的相同类型的数据

interface ServerRepsonse {
    userID: string;
}

interface ServerRequest {
    username: string;
    password: string;
}

var body = {
        username: "username",
        password: "password"
    };

let response = await axios<ServerRequest>({
            method: 'POST',
            url: "http://localhost:3000/users",
            data: body
        });

alert(response.data.userID);
接口服务器repsonse{
userID:string;
}
接口服务器请求{
用户名:字符串;
密码:字符串;
}
变量体={
用户名:“用户名”,
密码:“密码”
};
让响应=等待axios({
方法:“POST”,
url:“http://localhost:3000/users",
资料来源:body
});
警报(response.data.userID);
如您所见,在本例中,reponse.data.userID将被标记为error。如果我传递ServerResponse接口,那么“data:body”将被标记为错误


这是axios的index.d.ts文件中的一个问题吗?我怎样才能解决它?我不想使用“any”。

当前的实现似乎没有完全使用泛型。但是你可以扩展它

使用安装axios类型

npm i @types/axios
然后使用创建一个文件
typings\axios.d.ts

declare namespace Axios {
  interface AxiosInstance {
    <TRequest, TResponse>(config: AxiosXHRConfig<TRequest>): IPromise<AxiosXHR<TResponse>>;
    post<TRequest, TResponse>(url: string, data?: TRequest, config?: AxiosXHRConfigBase<TResponse>): IPromise<AxiosXHR<TResponse>>;
  }
}
声明命名空间Axios{
界面轴向力{
(配置:AxiosXHRConfig):IPromise;
post(url:string,data?:TRequest,config?:AxiosXHRConfigBase):IPromise;
}
}
这将允许您使用:

import * as axios from 'axios';

interface DataToSend {
    name: string;
}
interface DataToReceive {
    status: number;
}

axios<DataToReceive>({ url: '' }).then(r => r.data.status);

axios<DataToSend, DataToReceive>({
    url: '',
    method: 'POST',
    data: { name: '' },
}).then(r => r.data.status);

axios.post<DataToSend, DataToReceive>('', { name: 'test' })
    .then(r => r.data.status);
import*作为axios从“axios”导入;
接口数据发送{
名称:字符串;
}
接口数据接收{
状态:编号;
}
axios({url:'})。然后(r=>r.data.status);
axios({
url:“”,
方法:“POST”,
数据:{name:''},
}).然后(r=>r.data.status);
post(“”,{name:'test'})
.然后(r=>r.data.status);

当前的实现似乎没有完全使用泛型。但是你可以扩展它

使用安装axios类型

npm i @types/axios
然后使用创建一个文件
typings\axios.d.ts

declare namespace Axios {
  interface AxiosInstance {
    <TRequest, TResponse>(config: AxiosXHRConfig<TRequest>): IPromise<AxiosXHR<TResponse>>;
    post<TRequest, TResponse>(url: string, data?: TRequest, config?: AxiosXHRConfigBase<TResponse>): IPromise<AxiosXHR<TResponse>>;
  }
}
声明命名空间Axios{
界面轴向力{
(配置:AxiosXHRConfig):IPromise;
post(url:string,data?:TRequest,config?:AxiosXHRConfigBase):IPromise;
}
}
这将允许您使用:

import * as axios from 'axios';

interface DataToSend {
    name: string;
}
interface DataToReceive {
    status: number;
}

axios<DataToReceive>({ url: '' }).then(r => r.data.status);

axios<DataToSend, DataToReceive>({
    url: '',
    method: 'POST',
    data: { name: '' },
}).then(r => r.data.status);

axios.post<DataToSend, DataToReceive>('', { name: 'test' })
    .then(r => r.data.status);
import*作为axios从“axios”导入;
接口数据发送{
名称:字符串;
}
接口数据接收{
状态:编号;
}
axios({url:'})。然后(r=>r.data.status);
axios({
url:“”,
方法:“POST”,
数据:{name:''},
}).然后(r=>r.data.status);
post(“”,{name:'test'})
.然后(r=>r.data.status);

是否有不使用中包含的定义文件的原因?是否有不使用中包含的定义文件的原因?