如何使用@types/express-session?

How to use @types/express-session?

当我写这篇文章时:

import { Request } from 'express-serve-static-core';

router.post((req: Request, res, next) => {
  req.session.user = user;
}

tsc 给我一个错误:

'Object is possibly 'undefined'.

我知道原始 Request 类型没有 session 字段。

我检查了 @types/express-session index.d.ts 文件,发现了这个:

declare global {
  namespace Express {
    interface Request {
      session?: Session;
      sessionID?: string;
    }
  //....
}

所以我想向 req 添加额外的字段 sessionsessionID 类型。

我该如何使用?像这样:req: Request & ExpressSessionRequest.

因此 req 将同时具有原始 Request 类型和 @types/express-session 添加的额外字段类型。

问题不在于 Request 没有 sessionsessionID 属性——express-session 的类型已经将属性添加到 Request 界面通过 declaration merging

错误来自打开 strictNullChecks 编译器选项。由于属性 session 在类型定义中被声明为可为空,因此编译器会准确地警告您。如果您确定 req.session 不是 null 或 undefined,您可以使用 not-null assertion operator (!) 来抑制错误:

router.post((req: Request, res, next) => {
    req!.session!.user = user;
})

或显式检查 null|undefined:

router.post((req: Request, res, next) => {
    if (req.session) {
        req.session.user = user;
    }
})

如果要使 sessionsessionID 属性不可为 null,则可以编写自己的自定义类型:

type YourSessionRequest = Request & {
    session: Express.Session;
    sessionID: string;
}
router.post((req: YourSessionRequest, res, next) => {
    req.session.user = user;
})