TypeScript: 使用自定义类扩展 Express.Session 接口

18 浏览
0 Comments

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接口中?

0
0 Comments

问题出现的原因是需要在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

0
0 Comments

问题的出现原因:

在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接口。

0
0 Comments

问题的出现原因是可能由于包的版本问题,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"

结果:

enter image description here

谢谢,这段代码对我来说是有效的,适用于最新版本的包("express": "^4.17.1", "express-session": "^1.17.2", "typescript": "^3.6.4")。

非常清晰简洁,附带代码片段和.json版本。谢谢。

有人可以将我指向正确的文档吗?我阅读了这份文档,但在一半的时候迷失了方向typescriptlang.org/docs/handbook/declaration-merging.html

0