Pesquisa de site

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

Artigos relacionados