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

Posted

技术标签:

【中文标题】打字稿 - HeadersInit 类型上不存在“授权”【英文标题】:Typescript - "Authorization" does not exist on type HeadersInit 【发布时间】:2021-07-24 12:58:57 【问题描述】:

我正在使用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 并不会看起来很专业)

【问题讨论】:

【参考方案1】:

解决办法如下:

const headersInit: HeadersInitt = ;
options.header = headersInit;

一般情况下,如果可能,您希望避免使用类型断言 (as)。

替代解决方案:如果您知道options.headers 既不是Headers 也不是string[][] ,您可以这样做:

options.headers =  as  [key: string]: string 

【讨论】:

以上是关于打字稿 - HeadersInit 类型上不存在“授权”的主要内容,如果未能解决你的问题,请参考以下文章

与打字稿反应:“历史”类型上不存在属性“推送”

解决打字稿错误的最佳方法 - 类型上不存在属性

“键盘”类型上不存在打字稿错误属性“hideKeyboardAccessoryBar”。在 IONIC Moodle 应用程序上

类型“typeof File”离子打字稿上不存在属性“moveFile”

打字稿和猫鼬:“文档”类型上不存在属性“x”

打字稿:类型上不存在属性“导航”省略反应导航v5