Javascript axios的防御类型问题
我已经安装了带有npm和打字的axios 现在,要在TypeScript中使用它,我需要向它传递一个type(T)。问题是,这个T同时用于请求接口和响应接口,这没有任何意义,因为服务器显然不返回它接收的相同类型的数据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 = {
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);
是否有不使用中包含的定义文件的原因?是否有不使用中包含的定义文件的原因?