如何使用@types/express-session?

Posted

技术标签:

【中文标题】如何使用@types/express-session?【英文标题】:How to use @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 添加的额外字段类型。

【问题讨论】:

【参考方案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 属性始终存在,则需要更新类型。如果您想自己覆盖属性,可以尝试我更新的答案中的选项。

以上是关于如何使用@types/express-session?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?