微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打字稿-类型 HeadersInit 上不存在“授权”

如何解决打字稿-类型 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 举报,一经查实,本站将立刻删除。