当我写这个时:
import { Request } from 'express-serve-static-core';
router.post((req: Request, res, next) => {
req.session.user = user;
}
tsc
给我一个错误:
'对象可能'未定义'。
我知道原著Request
类型没有session
field.
I check @types/express-session
index.d.ts
文件,发现这个:
declare global {
namespace Express {
interface Request {
session?: Session;
sessionID?: string;
}
//....
}
所以我想添加额外的字段session
and sessionID
键入req
.
我该如何使用?像这样:req: Request & ExpressSessionRequest
.
So the req
都会有原来的Request
类型和额外字段类型@types/express-session
add.
问题不在于这个Request
没有session
or sessionID
属性 -- 的类型express-session
已经将属性添加到Request
接口通过声明合并 https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces.
该错误来自转动strictNullChecks
编译器选项打开。由于属性session
在类型定义中被声明为可为空,编译器会准确地警告您。如果你确定req.session
不为 null 或 undefined,您可以使用非空断言运算符 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-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
and sessionID
属性不可为空,那么您可以编写自己的自定义类型:
type YourSessionRequest = Request & {
session: Express.Session;
sessionID: string;
}
router.post((req: YourSessionRequest, res, next) => {
req.session.user = user;
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)