TypeScript:用自己的类扩展 Express.Session 接口
Posted
技术标签:
【中文标题】TypeScript:用自己的类扩展 Express.Session 接口【英文标题】:TypeScript: Extend Express.Session interface with own class 【发布时间】:2016-12-18 10:32:27 【问题描述】:我正在开发一个带有 npm 包的 Typescript 项目。我想在 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 //I want to use it like this.
问题是,用户在 de d.ts 文件中是未知的。但既不需要也不需要导入用户文件修复。
如何将自己的类添加到会话界面?
【问题讨论】:
你可能做不到。您可以向 typescript 编译器声明Session
实例具有此用户属性,但实际上(在运行时)并非如此。 Express 会执行你的函数,他们会传递一个有会话的请求,但是这个会话没有这个用户。
如果我也将它实现为 d.ts 文件中的接口,它就可以工作。但是如果我只需要写一次就更好了。或者至少类和接口在同一个文件中。
【参考方案1】:
聚会有点晚了,但应该可以将你的接口导入到定义文件中
import User from '../models/user';
declare global
namespace Express
interface Session
_user?: User
【讨论】:
有点晚了......这个问题是在我第一次打字的日子里,现在很清楚?但你的答案是正确的,所以我接受它 这对我不起作用,但另一个答案确实如此。 @史密斯先生【参考方案2】:可能是由于软件包版本,@Vitalii 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",
"@types/express-session": "^1.17.3",
"@types/express": "^4.17.11",
"typescript": "^3.9.7"
结果:
【讨论】:
谢谢,这是适用于我最新版本软件包的代码(“express”:“^4.17.1”,“express-session”:“^1.17.2”,“打字稿”:“^3.6.4”)。【参考方案3】:对我来说types.express-session.d.ts
:
declare namespace Express
interface CustomSessionFields
myCustomField: string
export interface Request
session: Session & Partial<SessionData> & CustomSessionFields
这个答案与这个post有关
【讨论】:
以上是关于TypeScript:用自己的类扩展 Express.Session 接口的主要内容,如果未能解决你的问题,请参考以下文章
如何让 TypeScript 对扩展从“节点模块”导入的类感到满意?
用 Jest 测试 TypeScript:“没有重载匹配这个调用”