Joseph
Joseph

Reputation: 1474

how to declare typescript interface extension to node request session object?

In the following, returnTo is added to the session object by my passport methods. How do I declare its interface in typescript?

import express = require('express');
import expressSession = require('express-session');

// how to declare presence of returnTo, which is not in underlying type?

export function createSession(req: express.Request, res: express.Response, next: Function) {

  passport.authenticate('local', (err: any, user: UserInstance, info: any) => {
    //. . .
    req.logIn(user, (err) => {
      //. . .
      res.redirect(req.session.returnTo || '/');
    });
  })(req, res, next);
};

Upvotes: 7

Views: 4976

Answers (2)

Camilo Azula
Camilo Azula

Reputation: 31

Just create a generic T and passed instead of request

<T extends {session: {user: any}}, Request>(sessionRequest: T) => {}

Upvotes: 3

Daniel Earwicker
Daniel Earwicker

Reputation: 116744

There's a type declaration for express-session on DefinitelyTyped:

https://github.com/borisyankov/DefinitelyTyped/blob/master/express-session/express-session.d.ts

Following the pattern in that file, you can create a new d.ts (call it whatever you want) containing:

declare module Express {
  export interface Session {
    returnTo: string;
  }
}

TypeScript will "merge" this extra property into the existing definitions.

Upvotes: 7

Related Questions