AxiosHeaders类型难以使用

r1zk6ea1  于 5个月前  发布在  iOS
关注(0)|答案(2)|浏览(85)

描述bug

  • AxiosResponse["headers"] 被输入为 RawAxiosResponseHeaders | AxiosResponseHeaders
  • (1) 为什么它不总是 AxiosResponseHeaders ?
  • (2) 如果我只处理 AxiosResponseHeaders (更具体地说是 AxiosHeaders 的示例),Typescript 不允许我使用 new AxiosHeaders(response.headers) ,因为 RawAxiosResponseHeaders 是一个 Partial
  • (3) AxiosHeaders.get 声称返回 string | string[] | number | boolean | AxiosHeaders | null ,迫使调用者处理这些类型中的任何一种。实际上,难道不是你应该期望的是 string | string[] | undefined 吗?

重现问题

https://codesandbox.io/s/axios-typescript-headers-issue-64vrrl?file=/src/index.ts

代码片段

Copied from codesandbox above:

  const r = await axios.request({
    method: "get",
    url: "https://httpbin.org/response-headers",
  });

  // (1) TS ERROR: `.get` is not callable because `r.headers` may not be a `AxiosHeaders`
  r.headers.get("a");
  // Let's force it...
  // (2) TS ERROR: Nope, that doesn't work either.
  const headers = new AxiosHeaders(r.headers);

  if (!(typeof ha === "string" || Array.isArray(ha))) {
    // (3) TS ANNOYING: Narrows type of `ha` to `number | boolean | AxiosHeaders | null`
    //     In practice, only `undefined` is possible (AFAIK).
    ha;
  }

预期行为

  • AxiosResponse["headers"] 应该始终是 AxiosHeaders (修复(1)),或者 new AxiosHeaders(r.headers) 是可能的 (修复(2))
  • AxiosHeaders.get 的返回类型应该比输入类型更严格,因为 AxiosHeaders 对输入进行了规范化。具体来说,AxiosHeaders.get 应该返回 string | string[] | undefined

Axios版本

1.5.1.4

适配器版本

  • 无响应*

浏览器

N/A

浏览器版本

N/A

Node.js版本

16.15.1

OS

N/A

其他库版本

N/A

其他上下文/截图

N/A
ryevplcw

ryevplcw1#

我很高兴能参与PR工作。
已经有一个概念验证提交:selimb@58a5c71
刚刚注意到AxiosHeaders的文档最近已经被提交了。应该也应该更新那些文档。

vjrehmav

vjrehmav2#

当前,要在拦截器中检查是否包含特定的响应头,需要这样做:

axiosInstance.interceptors.response.use((response) => {
    if (response.headers instanceof AxiosHeaders && response.headers.has('X-CSRF-Token')) {
        //...
    }

instanceof检查会收到Invalid 'instanceof' check: 'headers' has type that is not related to 'AxiosHeaders'的警告,但它仍然有效。没有这个看似无效的instanceof检查,在TypeScript中是不可能实现的。

相关问题