如何为TypeScript扩展类型声明?



以下问题类似:使用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))
})

相关内容

  • 没有找到相关文章