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:“没有重载匹配这个调用”

打字稿可变泛型类,接受扩展公共基础的可变数量的类对象?

为啥我不能在 Typescript 中扩展“任何”?

在扩展 EventEmitter 的 TypeScript 类中声明事件

在 TypeScript 中扩展另一种类型的任何类型的参数?