TypeScript: расширение интерфейса Express.Session собственным классом

Я работаю над проектом Typescript с пакетами npm. Я хочу добавить свойство в интерфейс 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. Но ни требовать, ни импортировать пользовательский файл не исправляет.

Как я могу добавить свой собственный класс в интерфейс сеанса?


person Mr. Smith    schedule 11.08.2016    source источник
comment
Вы, наверное, не сможете этого сделать. Вы можете объявить компилятору машинописного текста, что экземпляр Session имеет это свойство пользователя, но на самом деле (во время выполнения) это не так. Express выполнит вашу функцию, и они передадут запрос, который имеет сеанс, но в этом сеансе не будет этого пользователя.   -  person Nitzan Tomer    schedule 11.08.2016
comment
он работает, если я также реализую его как интерфейс в файле d.ts. Но было бы лучше, если бы мне нужно было написать его только один раз. Или хотя бы класс и интерфейс в одном файле.   -  person Mr. Smith    schedule 12.08.2016


Ответы (2)


Немного поздно для вечеринки, но должна быть возможность импортировать ваш интерфейс в файл определений

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

declare global {
  namespace Express {
    interface Session {
      _user?: User
    }
  }
}
person Vitalii Zurian    schedule 15.11.2019
comment
немного поздно ... этот вопрос был в мои первые дни машинописи и теперь довольно ясен ???? но ваш ответ правильный, поэтому я его принимаю - person Mr. Smith; 18.11.2019

Возможно, из-за версии пакета ответ @Vitalii Zurian у меня не работает. Если вы хотите расширить данные сеанса на req.session и пройти проверку типа TSC, вам следует расширить SessionData интерфейс.

E.g.

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"

результат:

введите описание изображения здесь

person slideshowp2    schedule 13.01.2021
comment
Спасибо, это код, который работал у меня с последними версиями пакетов (экспресс: ^ 4.17.1, экспресс-сессия: ^ 1.17.2, машинописный текст: ^ 3.6.4). - person workwise; 02.06.2021