如何解决打字稿-类型 HeadersInit 上不存在“授权”
我正在使用 node-fetch
npm 模块,并有一个辅助函数来向第三方服务发出授权请求(基本上只是用于添加授权标头的中间件)。
async function makeAuthorizedRequest(url: string,options: Requestinit) {
if (!options) {
options = { headers: {} as HeadersInit }
}
if (!options.headers) {
options.headers = {} as HeadersInit
}
options.headers.Authorization = `Bearer ${access_token}`
if (!options.headers['User-Agent']) {
options.headers['User-Agent'] = USERAGENT
}
return fetch(url,options)
}
Requestinit
类型定义为具有 headers
类型的 HeadersInit
属性,定义如下
export type HeadersInit = Headers | string[][] | { [key: string]: string };
我的 IDE (VSCode) 中出现两个明显错误,tsc
拒绝编译它,因为
Property 'Authorization' does not exist on type 'Headers'.ts(2339)
和
Element implicitly has an 'any' type because expression of type '"User-Agent"' can't be used to index type 'HeadersInit'.
Property 'User-Agent' does not exist on type 'HeadersInit'.ts(7053)
现在显然“User-Agent”和“Authorization”是有效的 http 标头,根据我的理解,{[key: string]: string}
类型定义应该允许这样做,因为“User-Agent”和“Authorization”是字符串及其值被设置为字符串。为什么 tsc 看不到这一点,我该如何解决?
(我过去在受影响的行上使用过 //@ts-ignore
,但我想了解它关注什么以及将来如何解决这个问题 - 因为在整个代码库中都使用了 ts-ignore看起来不专业)
解决方法
解决办法如下:
const headersInit: HeadersInitt = {};
options.header = headersInit;
通常,您希望尽可能避免类型断言 (as
)。
替代解决方案:如果您知道 options.headers
既不是 Headers
也不是 string[][]
,您可以这样做:
options.headers = {} as { [key: string]: string }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。