0

quand j'écris ceci:Comment utiliser @ types/express-session?

import { Request } from 'express-serve-static-core'; 

router.post((req: Request, res, next) => { 
    req.session.user = user; 
} 

tsc me donne une erreur: 'Object is possibly 'undefined'.

Ouais, je sais, le type d'origine express Request n'a pas le champ session.

Je vérifie @types/express-session fichier index.d.ts, trouvé ceci:

declare global { 
    namespace Express { 
    interface Request { 
     session?: Session; 
     sessionID?: string; 
    } 
    //.... 
} 

Je veux ajouter le champ supplémentaire session et sessionID de type à la req.

Comment l'utiliser? comme ceci: req: Request & ExpressSessionRequest.

Ainsi le req aura à la fois le type Request d'origine et le type de champs supplémentaires auquel @types/express-session ajoutera.

Répondre

1

Le problème est pas Request n'a pas les session ou sessionID propriétés - les typages pour express-session ajoute déjà les propriétés à Request interface via declaration merging.

L'erreur provient de l'activation de l'option du compilateur strictNullChecks. Puisque les propriétés session sont déclarées comme nulles dans la définition de type, le compilateur vous avertit exactement cela. Si vous êtes sûr que req.session est non nulle de non définie, vous pouvez utiliser la not-null assertion operator (!) pour supprimer l'erreur:

router.post((req: Request, res, next) => { 
    req!.session!.user = user; 
}) 

Ou vérifier null | non défini explicitement:

router.post((req: Request, res, next) => { 
    if (req.session) { 
     req.session.user = user; 
    } 
}) 

Si vous voulez rendre les propriétés session et sessionID non-nullable, alors vous pouvez écrire votre propre type personnalisé:

type YourSessionRequest = Request & { 
    session: Express.Session; 
    sessionID: string; 
} 
router.post((req: YourSessionRequest, res, next) => { 
    req.session.user = user; 
}) 
+0

oui. mon erreur. J'oublie la 'session' et' sessionID' sont des propriétés facultatives. Mais est-ce logique? Je pense toujours que les propriétés 'session' et' sessionID' existent toujours sur 'req' quand on utilise' express-session'. – novaline

+0

Je ne suis pas sûr 'express-session'. Si les propriétés 'session' et' sessionID' existent toujours, les typages doivent être mis à jour. Si vous souhaitez remplacer vous-même les propriétés, vous pouvez essayer l'option dans ma réponse mise à jour. – Saravana