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

TypeScript: Extend Express.Session interface with own class

我正在使用 npm 包开发一个 Typescript 项目。我想在Express.Session界面加一个属性

示例Class:

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.
}

问题是,d.ts 文件中的用户未知。但是既不要求也不导入用户文件修复了这个问题。

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

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

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

declare global {
  namespace Express {
    interface Session {
      _user?: User
    }
  }
}

可能是包版本的原因,@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"

结果:

对我来说types.express-session.d.ts:

declare namespace Express {
    interface CustomSessionFields {
        myCustomField: string
    }

    export interface Request {
        session: Session & Partial<SessionData> & CustomSessionFields
    }
}

这个答案与此有关