我试图添加一个属性来表达使用typescript从中间件请求对象。但是,我不知道如何向对象添加额外的属性。如果可能的话,我宁愿不用括号。
我正在寻找一个解决方案,允许我写类似的东西(如果可能的话):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
我试图添加一个属性来表达使用typescript从中间件请求对象。但是,我不知道如何向对象添加额外的属性。如果可能的话,我宁愿不用括号。
我正在寻找一个解决方案,允许我写类似的东西(如果可能的话):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
当前回答
如果你尝试了所有的答案,仍然没有得到工作,这里有一个简单的hack
app.use((req, res, next) => {
(req as any).property = setProperty();
next();
});
这将把req对象转换为任意类型,因此您可以添加任何想要的属性。 请记住,这样做将失去req对象的类型安全性。
其他回答
我已经改变了响应类型,包括ApiResponse(一个自定义响应对象)response <ApiResponse>
export interface ApiResponse {
status?: string
error?: string
errorMsg?: string
errorSubject?: string
response?: any
}
const User = async (req: Request, res: Response<ApiResponse>, next: NextFunction) => {
try {
if (!username) return res.status(400).send({ errorMsg: 'Username is empty' })
/* ... */
} catch(err){
/* ... */
}
}
现在回答这个问题可能已经很晚了,但无论如何,我是这样解决的:
确保在tsconfig文件中包含了类型的源代码(这可能是一个全新的线程) 在types目录中添加一个新目录,并将其命名为要为其扩展或创建类型的包。在本例中,您将创建一个名为express的目录 在express目录中创建一个文件,并将其命名为index.d.ts(必须与此完全相同) 最后,为了扩展类型,你只需要放如下代码:
declare module 'express' {
export interface Request {
property?: string;
}
}
我也有同样的问题,我是这样解决的:
// /src/types/types.express.d.ts
declare namespace Express {
export interface Request {
user: IUser
}
}
但有一些条件是必须的!
添加到tsconfig。json配置
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
},
在此之后,tsc将构建bundle,而ts-node则不会。
必须在编译器命令中添加——files
ts-node --files src/server.ts
如果你尝试了所有的答案,仍然没有得到工作,这里有一个简单的hack
app.use((req, res, next) => {
(req as any).property = setProperty();
next();
});
这将把req对象转换为任意类型,因此您可以添加任何想要的属性。 请记住,这样做将失去req对象的类型安全性。
只需将属性添加到req。params对象。
req.params.foo = "bar"