TypeScript:使用自己的类扩展 Express.Session 接口

Mr.*_*ith 9 node.js npm express typescript express-session

我正在使用 npm 包进行 Typescript 项目。我想向 Express.Session 接口添加一个属性。

示例类:

class User {
    name: string;
    email: string;
    password: string;
}

export = User;
Run Code Online (Sandbox Code Playgroud)

接口定义的新 d.ts 文件(不想编辑 express-session.d.ts):

declare namespace Express {
    interface Session {
        user: User
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序

import User = require('./User');

function (req: express.Request, res: express.Response) {
    req.session.user //I want to use it like this.
}
Run Code Online (Sandbox Code Playgroud)

问题是,在 de d.ts 文件中不知道该用户。但是既不需要也不需要导入用户文件来解决这个问题。

如何将我自己的类添加到会话界面?

sli*_*wp2 16

可能是由于软件包版本,@Vitalii Zurian 提供的答案对我不起作用。如果要扩展会话数据req.session并通过 TSC 类型检查,则应扩展SessionData接口。

例如

User.ts

class User {
  name: string = '';
  email: string = '';
  password: string = '';
}

export = User;
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

包版本:

class User {
  name: string = '';
  email: string = '';
  password: string = '';
}

export = User;
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明


Vit*_*ian 7

聚会有点晚,但应该可以将您的界面导入到定义文件中

import { User } from '../models/user';

declare global {
  namespace Express {
    interface Session {
      _user?: User
    }
  }
}
Run Code Online (Sandbox Code Playgroud)