axios 的 DefenitelyTyped 问题
Issue with the DefenitelyTyped of axios
我已经用 npm 和 typings 安装了 axios。
现在,要在 TypeScript 中使用它,我需要向它传递一个类型 (T)。问题是这个T既用于请求的接口,也用于响应的接口,这没有任何意义,因为显然服务器return接收到的数据类型不同。
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);
如您所见,在此示例中 reponse.data.userID 将被标记为错误。如果我改为传递 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>>;
}
}
这将允许您使用:
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);
我已经用 npm 和 typings 安装了 axios。
现在,要在 TypeScript 中使用它,我需要向它传递一个类型 (T)。问题是这个T既用于请求的接口,也用于响应的接口,这没有任何意义,因为显然服务器return接收到的数据类型不同。
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);
如您所见,在此示例中 reponse.data.userID 将被标记为错误。如果我改为传递 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>>;
}
}
这将允许您使用:
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);