如何扩展 Express.Application 的类型以提供 app.locals 的类型

Ant*_*ina 6 express typescript

在我们的应用程序中,我们向 app.locals 添加了很多配置对象,这些对象在我们的中间件中使用。

const app = Express();
app.locals = {
  someConfig: config
}
Run Code Online (Sandbox Code Playgroud)

目前,我们为 Request 对象提供了自定义类型,可以正常工作

declare namespace Express {
  export interface Request {
    featureFlags?: FeatureFlag;
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道locals来自 Express.Application 所以我尝试了这个,但它不起作用。

declare namespace Express {
  export interface Application {
    locals: {
      someConfig: config;
    };
  }

  export interface Request {
    featureFlags?: FeatureFlag;
  }
}
Run Code Online (Sandbox Code Playgroud)

有人成功将类型添加到 app.locals 吗?

小智 -2

您可以转到node_modules/@types/express-serve-static-core/index.d.ts中的原始文件声明,而不是使用新的声明文件。并搜索应用程序界面。诀窍是在该接口上定义另一个属性,并且所有路由都可以访问该属性,类似于 locals 属性。

  export interface Application<
    Locals extends Record<string, any> = Record<string, any> 
> extends EventEmitter, IRouter, Express.Application {
    //Make sure to keep all the others properties on the interface
    locals: Locals 
    db: mongoDb.Db //Here is the db key I've added, and all my routes can access it, just like the locals property.

 ];
}
Run Code Online (Sandbox Code Playgroud)

app.db ="whatever you need"现在,您可以使用所有自动完成功能为该属性分配一个值。在您的路由处理程序或中间件中,您可以使用req.app.db.

  • 你不应该直接在node_modules中修改东西,因为当你npm安装时它们会被覆盖,不会去你的仓库,还有很多很多其他原因 (2认同)