如何使用@ types / express-session?

问题描述 投票:2回答:1

当我这样写:

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添加的额外字段类型。

typescript typescript-typings typescript2.0 express-session
1个回答
4
投票

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

该错误来自打开strictNullChecks编译器选项。由于属性session在类型定义中声明为可为空,因此编译器会向您发出警告。如果你确定req.session不是undefined的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;
})
© www.soinside.com 2019 - 2024. All rights reserved.