我正在尝试添加一个属性来表达使用打字稿来自中间件的请求对象。但是,我不知道如何向对象添加额外的属性。如果可能的话,我宁愿不使用括号表示法。
我正在寻找一个解决方案,允许我写类似的东西(如果可能的话):
app.use((req, res, next) => {
req.property = setProperty();
next();
});
对于较新版本的express,您需要扩充< code > express-serve-static-core 模块。
这是需要的,因为现在Express对象来自那里:https://github . com/DefinitelyTyped/DefinitelyTyped/blob/8 FB 0 e 959 C2 c 7529 b5 fa 4793 a 44 b 41 b 797 AE 671 b 9/types/Express/index . d . ts # L19
基本上,使用以下内容:
declare module 'express-serve-static-core' {
interface Request {
myField?: string
}
interface Response {
myField?: string
}
}
正如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中还涵盖了扩展全局命名空间。
您想创建一个自定义定义,并使用Typescript中称为声明合并的功能。这是常用的,例如在方法覆盖
中。
创建一个文件< code>custom.d.ts,并确保将其包含在您的< code>tsconfig.json的< code > files -部分(如果有)中。内容可能如下所示:
declare namespace Express {
export interface Request {
tenant?: string
}
}
这将允许您在代码中的任何点使用如下所示的内容:
router.use((req, res, next) => {
req.tenant = 'tenant-X'
next()
})
router.get('/whichTenant', (req, res) => {
res.status(200).send('This is your tenant: '+req.tenant)
})
问题内容: 我正在尝试添加一个属性以使用Typescript从中间件表达请求对象。但是我不知道如何向对象添加额外的属性。如果可能的话,我宁愿不使用括号符号。 我正在寻找一种解决方案,允许我编写与此类似的内容(如果可能): 问题答案: 您想要创建一个自定义定义,并在Typescript中使用一个称为声明合并的功能。这是常用的,例如在中。 创建一个文件,并确保将其包含在您的-部分中(如果有)。内容如下
我有一个节点。js应用程序,将一些配置信息附加到对象: TypeScript 编译器不喜欢这样,因为 类型没有名为 的对象: TS2339:类型“Global”上不存在属性“myConfig”。 我不想这样做: 我如何扩展< code>Global类型以包含< code>myConfig或者只是告诉TypeScript闭嘴并相信我?我更喜欢第一个。 我不想更改中的声明。我看到了这篇SO帖子,并尝试
问题内容: 我有一个node.js应用程序,该应用程序将一些配置信息附加到该对象: TypeScript编译器不喜欢这样,因为该类型没有名为的对象: TS2339:类型“ Global”上不存在属性“ myConfig”。 我不想这样做: 如何扩展类型以包含或只是告诉TypeScript关闭并信任我?我希望第一个。 我不想更改其中的声明。我看到了这样的帖子,并尝试了这个: 作为扩展现有接口的一种方
我在挣扎。 当扩展一个类时,我可以很容易地向它添加一些新属性。 但是,当我扩展基类时,如果我想向基类的对象(简单对象的属性)添加新属性,该怎么办? 下面是一个带有一些代码的示例。 基类 派生类 现在,正如您可以从行内注释中看到的,这将激怒TypeScript。但这在JavaScript中工作。那么,实现这一目标的正确方法是什么呢?如果没有,问题是在我的代码模式本身吗?什么模式适合这个问题? 也许您
问题内容: Typescript总是抱怨调色板中缺少某些属性。如果添加,我的应用程序运行正常,但显然我想避免这种情况。我是Typescript的新手,这是我尝试过的。 这会引发错误, 对我来说这是一个令人困惑的错误,因为类型I不在任何地方使用该类型。 如何在此处适当扩展调色板? 问题答案: 解 参考 如果我们看一下createMuiTheme.d.ts 我们会发现这一点,并发挥不同的作用。 主题:
我想使用打字稿从材料-用户界面扩展按钮组件的道具,以便能够将额外的道具传递给它的孩子。 我尝试在中添加以下声明。/app/types/material_ui.d.ts: 这将引发错误“TS2693:'Button'仅引用一种类型,但在此处用作值。 我也试过声明: 这将引发错误“TS2323:无法重新声明导出的变量'按钮'”。 我的tsconfig.json是这样的: 最后是来自Menty-UI的原
属性的简洁表示法 ES6允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 var foo = 'bar'; var baz = {foo}; baz // {foo: "bar"} // 等同于 var baz = {foo: foo}; 上面代码表明,ES6允许在对象之中,只写属性名,不写属性值。这时,属性值等于属性名所代表的变量。下面是另一个例子。 function f(
问题内容: 我正在将React.js与TypeScript一起使用。有什么方法可以创建从其他组件继承但具有一些其他道具/状态的React组件? 我想要达到的目标是这样的: 但是,如果我把这个会失败中,我得到一个错误的打字稿(类型的参数是不能分配给类型)。我想这不是TypeScript专用的东西,而是将继承与泛型(?)混合使用的一般限制。是否有任何类型安全的解决方法? 更新 我选择的解决方案(基于D