当我写这篇文章时:
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;
}
//....
}
所以我想在session
添加额外的字段sessionID
和req
类型。
我该怎么用?像这样:req: Request & ExpressSessionRequest
。
因此,req
将包含原始Request
类型和@types/express-session
添加的额外字段类型。
答案 0 :(得分:4)
问题不在于Request
没有session
或sessionID
属性 - express-session
的输入已经将属性添加到Request
接口通过declaration merging。
错误来自打开strictNullChecks
编译器选项。由于属性session
在类型定义中声明为可为空,因此编译器会向您发出警告。如果您确定req.session
未定义为null,则可以使用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;
})