【问题标题】:TypeScript: Extend Express.Session interface with own classTypeScript:用自己的类扩展 Express.Session 接口
【发布时间】: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 文件中的接口,它就可以工作。但是如果我只需要写一次就更好了。或者至少类和接口在同一个文件中。

标签: node.js express typescript npm express-session


【解决方案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有关

【讨论】:

    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 2020-06-09
    • 2020-04-09
    • 2021-08-07
    • 2015-04-01
    • 2018-09-23
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多