我正在使用Authorization模块,并有一个助手函数,用于向第三方服务发出授权请求(基本上只是一个中间件,用于在node-fetch
头中添加)。
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
类型定义为具有HeadersInit
类型的headers
属性,如下所示
export type HeadersInit = Headers | string[][] | { [key: string]: string };
我的集成开发环境(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)
很明显,“用户代理”和“授权”是有效的http头,根据我的理解,类型{[key: string]: string}
定义应该允许这样做,因为“用户代理”和“授权”是字符串,它们的值被设置为字符串。为什么tsc看不到这一点,我如何才能真正修复它?
(我过去在受影响的代码行上使用过//@ts-ignore
,但我想了解它所关心的是什么,以及将来如何解决这个问题-因为在整个代码库中使用ts-ignore看起来并不专业)
发布于 2021-05-02 03:13:47
以下是解决方案:
const headersInit: HeadersInitt = {};
options.header = headersInit;
通常,您希望尽可能避免类型断言(as
)。
另一种解决方案:如果您知道options.headers
既不是Headers
也不是string[][]
,您可以这样做:
options.headers = {} as { [key: string]: string }
https://stackoverflow.com/questions/67346496
复制相似问题