typescript - Como usar @types/express-session?
quando eu escrevo isto:
import { Request } from 'express-serve-static-core';
router.post((req: Request, res, next) => {
req.session.user = user;
}
tsc me dá um erro:
O objeto possivelmente é 'undefined'.
Eu sei que o tipo original Request não possui o campo session.
Eu verifico o arquivo @types/express-session index.d.ts, encontrei isto:
declare global {
namespace Express {
interface Request {
session?: Session;
sessionID?: string;
}
//....
}
Então, eu quero adicionar um campo extra session e um tipo sessionID ao req.
Como posso usar ? assim: req: Request & ExpressSessionRequest.
Então o req terá tanto o tipo original Request quanto o tipo de campos extras que @types/express-session adiciona.
Resposta #1
O problema não é que Request não tenha as propriedades session ou sessionID -- as tipagens de express-session já adicionam as propriedades à interface Request através da fusão de declarações.
O erro vem de ativar a opção de compilador strictNullChecks. Como a propriedade session é declarada como anulável na definição de tipo, o compilador avisa exatamente isso. Se você tiver certeza de que req.session não é nulo nem indefinido, você pode usar o operador de afirmação de não nulo (!) para suprimir o erro:
router.post((req: Request, res, next) => {
req!.session!.user = user;
})
Ou verifique explicitamente se é nulo|indefinido:
router.post((req: Request, res, next) => {
if (req.session) {
req.session.user = user;
}
})
Se você quiser tornar as propriedades session e sessionID não nulas, então você pode escrever seu próprio tipo personalizado:
type YourSessionRequest = Request & {
session: Express.Session;
sessionID: string;
}
router.post((req: YourSessionRequest, res, next) => {
req.session.user = user;
})
