如何使用@ types / express-session?

时间:2017-08-23 03:07:28

标签: typescript typescript-typings typescript2.0 express-session

当我写这篇文章时:

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

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

tsc给了我一个错误:

  

'对象可能是'未定义'。

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

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

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

所以我想在session添加额外的字段sessionIDreq类型。

我该怎么用?像这样:req: Request & ExpressSessionRequest

因此,req将包含原始Request类型和@types/express-session添加的额外字段类型。

1 个答案:

答案 0 :(得分:4)

问题不在于Request没有sessionsessionID属性 - express-session的输入已经将属性添加到Request接口通过declaration merging

错误来自打开strictNullChecks编译器选项。由于属性session在类型定义中声明为可为空,因此编译器会向您发出警告。如果您确定req.session未定义为null,则可以使用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属性不可为空,那么您可以编写自己的自定义类型:

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