TypeScript: 使用自定义类扩展 Express.Session 接口
TypeScript: 使用自定义类扩展 Express.Session 接口
我正在使用Typescript项目和npm包工作。我想要向Express.Session接口添加一个属性。
示例类:
class User { name: string; email: string; password: string; } export = User;
新的d.ts文件用于接口定义(不想编辑express-session.d.ts):
declare namespace Express { interface Session { user: User } }
app.ts
import User = require('./User'); function (req: express.Request, res: express.Response) { req.session.user //我想要这样使用它。 }
问题是,在d.ts文件中无法识别User。但是无论是使用require还是import User文件都无法解决这个问题。
如何将自己的类添加到session接口中?
问题出现的原因是需要在TypeScript中扩展Express.Session接口,以添加自定义字段。解决方法是在types.express-session.d.ts
文件中声明一个命名空间Express,并在其中扩展Request接口。在Request接口的session字段中,使用交叉类型和Partial泛型将Session和SessionData接口与CustomSessionFields接口合并。
在types.express-session.d.ts
文件中添加如下代码:
declare namespace Express { interface CustomSessionFields { myCustomField: string } export interface Request { session: Session & Partial& CustomSessionFields } }
这样就可以在Express应用程序中使用自定义字段myCustomField。这个解决方法可以在Stack Overflow的这篇帖子中找到:post。
问题的出现原因:
在TypeScript中,我们经常需要扩展已有的接口,以满足特定的需求。在这个问题中,用户想要扩展Express.Session接口,以添加一个名为_user的可选属性。然而,他尝试了一种方法,但并没有得到预期的结果。
解决方法:
在这个问题中,有一个给出了解决方法的答案,但它并不适用于所有人。相反,另一个答案提供了解决方案。然而,没有提供具体的解决方法的细节。
解决方法中的代码:
import { User } from '../models/user'; declare global { namespace Express { interface Session { _user?: User } } }
这段代码使用了import语句导入User模型,并在全局命名空间下声明了一个命名空间Express。在这个命名空间下,我们扩展了Session接口,并添加了一个可选属性_user,其类型为User。
在这个问题中,用户想要扩展Express.Session接口,以添加一个可选属性。尽管他尝试了一种方法,但最终选择另一个答案中提供的解决方案。这个解决方案包括导入User模型,并在全局命名空间下扩展Session接口。
问题的出现原因是可能由于包的版本问题,Zurian提供的答案对我来说不起作用。如果你想扩展req.session
上的会话数据并通过TSC类型检查,你应该扩展SessionData接口。
例如:
User.ts
:
class User { name: string = ''; email: string = ''; password: string = ''; } export = User;
app.ts
:
import express from 'express'; import User from './User'; declare module 'express-session' { interface SessionData { user: User; } } function controller(req: express.Request, res: express.Response) { req.session.user; }
包版本:
"express": "^4.17.1",
"express-session": "^1.17.1",
"/express-session": "^1.17.3",
"/express": "^4.17.11",
"typescript": "^3.9.7"
结果:
谢谢,这段代码对我来说是有效的,适用于最新版本的包("express": "^4.17.1", "express-session": "^1.17.2", "typescript": "^3.6.4")。
非常清晰简洁,附带代码片段和.json版本。谢谢。
有人可以将我指向正确的文档吗?我阅读了这份文档,但在一半的时候迷失了方向typescriptlang.org/docs/handbook/declaration-merging.html。