如何使用@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-session
index.d.ts
文件,发现这个:
declare global
namespace Express
interface Request
session?: Session;
sessionID?: string;
//....
所以我想在req
中添加额外的字段session
和sessionID
。
我该如何使用?像这样:req: Request & ExpressSessionRequest
.
所以req
将具有原始Request
类型和@types/express-session
添加的额外字段类型。
【问题讨论】:
【参考方案1】:问题不在于Request
没有session
或sessionID
属性——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;
)
如果您想让session
和sessionID
属性不可为空,那么您可以编写自己的自定义类型:
type YourSessionRequest = Request &
session: Express.Session;
sessionID: string;
router.post((req: YourSessionRequest, res, next) =>
req.session.user = user;
)
【讨论】:
是的。我的错。我忘记了session
和 sessionID
是可选属性。但这有意义吗?我一直认为session
和sessionID
属性在使用req
时总是存在于express-session
上。
我不确定express-session
。如果session
和sessionID
属性始终存在,则需要更新类型。如果您想自己覆盖属性,可以尝试我更新的答案中的选项。以上是关于如何使用@types/express-session?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?