Axios 请求函数的类型为
get<T = any, R = AxiosResponse<T>>(url: string, config?: AxiosRequestConfig): Promise<R>
(
delete
、post
等类似键入),其中AxiosResponse
具有以下定义:
export interface AxiosResponse<T = any> {
data: T;
status: number;
statusText: string;
headers: any;
config: AxiosRequestConfig;
request?: any;
}
因此,使用 Axios 我可以提供
T
的类型,例如axios.get<{id: number}>(...)
。
因此,我得到返回类型
<Promise<AxiosResponse<{id: number}>>
,这导致以下代码进行类型检查:
const data: {id: number} = await axios.get<number>(...).then((response) => response.data)
所以我的问题是: Axios 是否验证过响应数据?或者我也可以做以下事情并获得同样的“安全”吗?
const data: {id: number} =
await axios.get<unknown>(...).then((response) => response.data as {id: number})
如果这不能给我任何安全性,那么这个类型变量的目的是什么?
Axios 本身并不对响应数据进行运行时类型验证。您提供给 Axios 请求的泛型类型主要用于编译时而不是运行时的 TypeScript 类型检查。因此,如果响应数据与预期类型不匹配,则不会直接从 Axios 得到错误;相反,如果您的使用与预期类型不匹配,您可能会在开发过程中收到 TypeScript 错误。
使用unknown然后转换响应数据本质上是在说你不信任类型系统并且你有责任确保数据的正确性
此方法不提供 TypeScript 关于 response.data 的实际结构的编译时类型安全性,但它将绕过 TypeScript 的类型检查
如果你想确保运行时响应数据符合某种类型,你可以使用像zod、Yup这样的验证库,或者编写自定义验证逻辑: