javascript 属性“user”在类型“Session &amp; Partial”上不存在< SessionData>

bgtovc5b  于 2022-12-17  发布在  Java
关注(0)|答案(6)|浏览(177)

我有一个javascript代码,我想把它转换成typescript

route.get('/order', async(req,res) => {  
    var sessionData = req.session;
    if(typeof sessionData.user === 'undefined')
    {        
        res.redirect('/panel/login');
    }

这是我的一段代码,过去在javascript中可以正常工作,但现在在user中出现此错误:
类型“会话&部分”上不存在属性“user”
我假设我应该为sessionData变量和(req, res)参数添加类型,但是我不知道应该为它分配什么类型。

PS:我知道这个问题看起来重复,但我已经尝试了其他类似问题的解决方案,它没有工作

任何帮助都将不胜感激。

vxbzzdmp

vxbzzdmp1#

正如express-session types注解中所述,必须使用Declaration merging
下面是在express-session上实现Declaration merging的方法:

import session from 'express-session';

declare module 'express-session' {
  export interface SessionData {
    user: { [key: string]: any };
  }
}
4dbbbstv

4dbbbstv2#

我刚刚遇到了和你一样的问题。这似乎是一个相当新的问题:see explanation here .
为了解决这个问题,我重载了Github问题中描述的模块:

import "express-session";
declare module "express-session" {
  interface SessionData {
    user: string;
  }
}

只需将string替换为该字段所需的任何类型。
我还在tsconfig.json中添加了./typing-stubs

"typeRoots": [
      "./typing-stubs",
      "./node_modules/@types"
]
hkmswyz6

hkmswyz63#

追踪源代码,你会发现这样一个注解:

/**
     * This interface allows you to declare additional properties on your 
     * session object 
     * using [declaration merging] 
     * (https://www.typescriptlang.org/docs/handbook/declaration-merging.html).
     *
     * @example
     * declare module 'express-session' {
     *     interface SessionData {
     *         views: number;
     *     }
     * }
     *
     */
    interface SessionData {
        cookie: Cookie;
    }

继续阅读文档;你会发现一个模块增强部分:https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
现在,您自己扩充“SessionData”并在以下位置向其添加“user”:源代码/类型/快速会话/索引.d.ts

import { SessionData } from "express-session"

declare module "express-session" {
    interface SessionData {
        user: { [key: string]: any }
    }
}

您的tsconfig.json应该设置类型根以在编译中包含声明:

"typeRoots": ["./node_modules/@types", "./src/types"],
b09cbbtk

b09cbbtk4#

我最近遇到了这个问题,这里是我想出的解决方案。

import { Request } from "express";
import { Session } from "express-session";

export type SessionWithUser = Session & { user: string | {}};

export type AuthRequest = Request & {
  session?: SessionWithUser;
  auth?: { user: string; permission_id: number };
};

字符串

hgc7kmma

hgc7kmma5#

这是供将来参考的,对于已经完成上述所有步骤但仍然失败的人(vscode不再显示错误,但仍然失败),这可能是ts-node问题,添加--transpile-only到您的package.json脚本,如下所示:nodemon --exec ts-node -T src/app.ts .
来源:Typescript Declaration Merging fail about Express Request

djp7away

djp7away6#

我刚做了这个

(req.session as ISession).UserName = payload.UserName;
(req.session as ISession).Email = payload.Email;

ISession是一个导出接口,它包含:

import { Session } from "express-session";

export interface ISession extends Session {
  UserName?: string;
  Email?: string;
}

所有其他的建议都说重写类型声明,那些建议对我不起作用。这是唯一起作用的。希望这对大家有帮助。

相关问题