我正在尝试添加一个属性来使用打字稿从中间件表达请求对象。但是我不知道如何为对象添加额外的属性。如果可能的话,我宁愿不使用括号表示法。
我正在寻找一种解决方案,可以让我写出类似的东西(如果可能的话):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
原文由 Isak Ågren 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试添加一个属性来使用打字稿从中间件表达请求对象。但是我不知道如何为对象添加额外的属性。如果可能的话,我宁愿不使用括号表示法。
我正在寻找一种解决方案,可以让我写出类似的东西(如果可能的话):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
原文由 Isak Ågren 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如 index.d.ts
中的评论 所建议的,您只需向全局 Express
命名空间声明任何新成员。例子:
declare global {
namespace Express {
interface Request {
context: Context
}
}
}
import * as express from 'express';
export class Context {
constructor(public someContextVariable) {
}
log(message: string) {
console.log(this.someContextVariable, { message });
}
}
declare global {
namespace Express {
interface Request {
context: Context
}
}
}
const app = express();
app.use((req, res, next) => {
req.context = new Context(req.url);
next();
});
app.use((req, res, next) => {
req.context.log('about to return')
res.send('hello world world');
});
app.listen(3000, () => console.log('Example app listening on port 3000!'))
扩展全局命名空间也包含 在 TypeScript Deep Dive 中。
原文由 basarat 发布,翻译遵循 CC BY-SA 4.0 许可协议
5 回答4.8k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
5 回答1.9k 阅读
2 回答1.3k 阅读✓ 已解决
3 回答2k 阅读
1 回答3.2k 阅读
您想创建一个自定义定义,并使用 Typescript 中名为 Declaration Merging 的功能。这是常用的,例如在
method-override
中。创建一个文件
custom.d.ts
并确保将其包含在您的tsconfig.json
的files
中(如果有)。内容可以如下所示:这将允许您在代码中的任何位置使用如下内容: