【问题标题】:How to use @types/express-session?如何使用@types/express-session?
【发布时间】:2018-01-31 11:18:04
【问题描述】:

当我写这个时:

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

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

tsc 给我一个错误:

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

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

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

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

所以我想在req 中添加额外的字段sessionsessionID

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

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

【问题讨论】:

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


    【解决方案1】:

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

    错误来自打开strictNullChecks 编译器选项。由于属性session 在类型定义中被声明为可为空,因此编译器会准确地警告您。如果您确定req.session 不是未定义的空值,您可以使用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;
    })
    

    【讨论】:

    • 是的。我的错。我忘记了 sessionsessionID 是可选属性。但这有意义吗?我一直认为sessionsessionID 属性在使用req 时总是存在于express-session 上。
    • 我不确定express-session。如果sessionsessionID 属性始终存在,则需要更新类型。如果您想自己覆盖属性,可以尝试我更新的答案中的选项。
    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 2018-03-07
    • 2018-12-14
    • 2021-09-22
    • 2019-05-14
    • 2023-02-01
    • 2018-05-18
    相关资源
    最近更新 更多