如何声明节点请求会话对象的打字稿接口扩展?

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

在下文中,returnTo 通过我的护照方法添加到会话对象。如何在打字稿中声明其接口?

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

DefinitelyTyped 上有 express-session 的类型声明:

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

按照该文件中的模式,您可以创建一个新的 d.ts(随意命名)包含:

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

TypeScript 会 "merge" 这个额外的 属性 到现有的定义中。

只需创建一个通用 T 并传递而不是请求

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