以下问题类似:使用Typescript扩展Express Request对象
我几乎尝试了答案和评论中列出的所有组合,但都没有成功。因为那个已经超过4岁了,我想重新问一下社区:
在Express应用程序中,我将user
属性附加到中间件auth
中的请求对象。
// index.ts
import express, { Request, Response } from 'express'
.
.
app.get('/test', auth, (req: Request, res: Response) => {
res.send(welcomeScreen(req.user?.client_name || ''))
})
我得到一个错误:
Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'
这是意料之中的。因此,我想扩展express.Request
对象的类型定义,以接受我的user
属性,假定在自定义d.ts
文件中。但无论我如何尝试,我仍然得到相同的错误。d.ts文件的确切内容应该是什么?到目前为止,我最好的投篮是:
// custom.d.ts
namespace Express {
export interface Request {
user?: {}
}
}
添加后,user
属性在IDE中被识别:
(property) Express.Request.user?: {} | undefined
但是我仍然得到相同的编译时错误。我是否也需要更改tsconfig
?谢谢!
// tsconfig.json
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./compiled",
"rootDir": "./src",
"strict": true,
"moduleResolution": "node",
"typeRoots": ["./types"],
"esModuleInterop": true, "skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
这是一个棘手的问题,因为有很多变化会产生类似的结果,但我认为这是正确的答案:
添加@types/express-serve-static-core
,然后在express-more.d中。ts文件:
import { Express } from "express-serve-static-core";
declare global {
namespace Express {
interface Request {
user?: {}
}
}
}
这是我们团队的解决方案:
// tsconfig.json
{
"compilerOptions": {
...
"typeRoots": [
"@types",
"node_modules/@types"
],
...
}
}
// @types/express/index.d.ts
export { }
declare global {
namespace Express {
interface Request {
user?: {}
}
}
}
最后按预期使用:
// src/index.ts
import express, { Request, Response } from 'express'
...
app.get('/test', auth, (req: Request, res: Response) => {
res.send(welcomeScreen(req.user))
})