我正在尝试添加一个自定义头到我的请求中,但是必须在接口中修改/实现它。
默认的Request
接口引用IncomingHttpHeaders
,所以我尝试用我自己的自定义标记头扩展这个接口。
import { IncomingHttpHeaders } from 'http';
declare module 'express-serve-static-core' {
interface IncomingHttpHeaders {
"XYZ-Token"?: string
}
}
我已经更新了我的.tsconfig
文件以读取./types
文件夹。我的文件名为index.d.ts
如果不使用自定义头,我可以成功地编译代码,但是当我尝试在代码中引用令牌头时,我得到了以下编译错误:
- 错误**
error TS2538: Type 'string[]' cannot be used as an index type.
req.headers['XYZ-Token']
如果我使用原始接口的任何值,一切都可以正常工作。
- 示例:**
req.headers['user-agent']
- 其他信息**:我使用的是NestJS,它在引擎盖下使用了Fastify/Express,我可以确认正在使用的Request接口来自Express,Fastify向后兼容所有Express模块,主要使用Fastify是因为它更快。
3条答案
按热度按时间kse8i1jr1#
声明中的模块名称似乎错误。
即使
IncomingHttpHeaders
接口从express-serve-static-core
附加到Request
对象,IncomingHttpHeaders
接口的原始源实际上也是http
包的一部分。下面的代码允许在代码中访问自定义头文件,并且正确编译了ts。
i1icjdpr2#
不管出于什么原因,它都认为你传入的字符串是一个数组,但是除此之外,如果你需要设置一个自定义的头(它不是一个动态值),你可以使用
@Header()
装饰器,如果它是动态的,你可以使用拦截器来捕获响应,并在那里设置头,比如u3r8eeie3#
我最近遇到过这样的问题,对我有效的解决方案是创建一个从 IncomingHttpHeaders 扩展的类型
我知道这不是解决问题的最“正式”的方法,但对我来说效果很好。