Wyszukiwanie w witrynie

node.js - TypeScript: Rozszerz interfejs Express.Session własną klasą


Pracuję nad projektem w TypeScript z pakietami npm. Chcę dodać właściwość do interfejsu Express.Session.

przykładowa klasa:

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

export = User;

Nowy plik d.ts dla definicji interfejsu (nie chcę edytować 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.
}

Problem polega na tym, że User nie jest znany w pliku de d.ts. Ale ani require, ani import pliku User tego nie naprawia.

Jak mogę dodać własną klasę do interfejsu sesji?

Odpowiedź #1

Może to być spowodowane wersją pakietu, odpowiedź podana przez @Vitalii Zurian nie działa u mnie. Jeśli chcesz rozszerzyć dane sesji w req.session i przejść kontrole typów TSC, powinieneś rozszerzyć interfejs SessionData.

Np.

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

wersje pakietów:

"express": "^4.17.1",
"express-session": "^1.17.1",
"@types/express-session": "^1.17.3",
"@types/express": "^4.17.11",
"typescript": "^3.9.7"

wynik :

Odpowiedź #2

Trochę spóźniony na imprezę, ale powinno być możliwe zaimportowanie twojego interfejsu do pliku definicji

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

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

Powiązane artykuły