0

私はこの書くとき:@ types/express-sessionの使い方は?

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

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

をTSCは私にエラーを与える:'Object is possibly 'undefined'.

ええ、私は知っている、急行元Requestタイプはsessionフィールドがありません。だから私はreqに余分なフィールドsessionsessionIDタイプを追加したい

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

私は@types/express-sessionindex.d.tsファイルをチェックし、これを発見しました。

どうすれば使用できますか?このように:req: Request & ExpressSessionRequest

したがって、reqは元のRequestタイプと追加フィールドタイプの両方を持ちます。@types/express-sessionが追加されます。 express-sessionのためのタイピングはすでにdeclaration merging経由Requestインターフェースにプロパティを追加します -

答えて

1

問題はRequestsessionまたはsessionID性質を持っていないということではありません。

エラーは、コンパイラオプションをオンにしたときに発生します。プロパティーsessionはタイプ定義でNULL可能と宣言されているため、コンパイラーはそれを正確に警告します。あなたはreq.sessionが未定義のヌルでないことが確実な場合は、エラー抑制するnot-null assertion operator!)を使用することができます。

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

またはNULLかどうかを確認する|未定義明示的に:

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

sessionsessionIDのプロパティをnullにできないようにするには、独自のカスタムタイプを作成します。

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

はい。私の間違い。私は 'session'と' sessionID'がオプションのプロパティであることを忘れています。しかしそれは理にかなっていますか? 'express-session'を使うときに' session'と 'sessionID'のプロパティが常に' req'に存在すると私は常に思っています。 – novaline

+0

私は 'express-session'とは分かりません。 'session'と' sessionID'プロパティが常に存在するなら、型を更新する必要があります。プロパティを自分で上書きしたい場合は、私の更新された回答でそのオプションを試すことができます。 – Saravana