描述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
2条答案
按热度按时间ryevplcw1#
我很高兴能参与PR工作。
已经有一个概念验证提交:selimb@58a5c71
刚刚注意到
AxiosHeaders
的文档最近已经被提交了。应该也应该更新那些文档。vjrehmav2#
当前,要在拦截器中检查是否包含特定的响应头,需要这样做:
instanceof检查会收到
Invalid 'instanceof' check: 'headers' has type that is not related to 'AxiosHeaders'
的警告,但它仍然有效。没有这个看似无效的instanceof检查,在TypeScript中是不可能实现的。