当我这样写:
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
添加的额外字段类型。
问题不在于Request
没有session
或sessionID
属性 - express-session
的输入已经通过Request
将属性添加到declaration merging接口。
该错误来自打开strictNullChecks
编译器选项。由于属性session
在类型定义中声明为可为空,因此编译器会向您发出警告。如果你确定req.session
不是undefined的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;
})