如何使用@ types/express-session?

如何使用@ 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-sessionindex.d.ts文件,发现这一点:

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

所以我要额外的外地sessionsessionID类型添加到req

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

因此req将有原始Request类型和额外的字段类型,其中@types/express-session添加。

的问题不在于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; 
}) 

或者检查空|未定义明确:

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; 
}) 
+0

是的。我的错。我忘记了'session'和'sessionID'是可选的属性。但它有道理吗?当我使用'express-session'的时候,我一直认为''session''和'sessionID'属性总是存在于'req'上。 – novaline

+0

我不确定'express-session'。如果'session'和'sessionID'属性总是存在,那么类型需要更新。如果你想自己覆盖属性,你可以尝试更新的答案中的选项。 – Saravana