如何使用@ types/express-session?
问题描述:
当我写这篇文章:如何使用@ types/express-session?
import { Request } from 'express-serve-static-core';
router.post((req: Request, res, next) => {
req.session.user = user;
}
TSC给我一个错误:'Object is possibly 'undefined'.
是啊,我知道了,原来快递类型Request
没有session
领域。
我检查@types/express-session
index.d.ts
文件,发现这一点:
declare global {
namespace Express {
interface Request {
session?: Session;
sessionID?: string;
}
//....
}
所以我要额外的外地session
和sessionID
类型添加到req
。
我该如何使用?像这样:req: Request & ExpressSessionRequest
。
因此req
将有原始Request
类型和额外的字段类型,其中@types/express-session
添加。
答
的问题不在于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;
})
或者检查空|未定义明确:
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'是可选的属性。但它有道理吗?当我使用'express-session'的时候,我一直认为''session''和'sessionID'属性总是存在于'req'上。 – novaline
我不确定'express-session'。如果'session'和'sessionID'属性总是存在,那么类型需要更新。如果你想自己覆盖属性,你可以尝试更新的答案中的选项。 – Saravana