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

ami*_*neh 11 javascript session node.js express typescript

我在 javascript 中有一个代码,我正在尝试将其转换为打字稿

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

这是我曾经在 js 中正常工作的一段代码,但现在我收到以下错误user

“会话和部分”类型上不存在属性“用户”

我假设我应该为sessionData变量和(req, res)参数添加类型,但我不知道应该为其分配什么类型。

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

任何帮助,将不胜感激

Kap*_*jza 28

express-session 类型评论中所述,您必须使用Declaration merging.

以下是您可以实施Declaration merging的方法express-session

import session from 'express-session';

declare module 'express-session' {
  export interface SessionData {
    user: { [key: string]: any };
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。我认为需要标记的重要一点是在声明文件顶部使用“import“express-session””。 (5认同)
  • 对所有使用“ts-node-dev”的人要特别注意。如果您将其添加到未直接包含在条目文件中的新文件中,请小心。`ts-node-dev` 在当前运行时不会接受任何类型更改。事实上,它只编译包含在入口文件中的文件,并根据导入/导出在树中工作,因此它不知道未直接包含在项目中的类型。tsc 编译和查找新类型没有问题,因此从现在开始,我仅使用带有“--transpile-only”参数的“ts-node-dev”,并让 tsc 进行类型检查。 (3认同)

小智 17

我刚遇到和你一样的问题。这似乎是一个相当新的问题:请参阅此处的解释

为了解决这个问题,我按照 github 问题中的描述重载了模块:

declare module "express-session" {
  interface Session {
    user: string;
  }
}
Run Code Online (Sandbox Code Playgroud)

只需替换string为该字段所需的任何类型。

  • 我应该怎么做?我的意思是我应该在新文件中编写此代码并将其导入到我的主文件中吗? (2认同)
  • `tsconfig.json` 有一个名为 typeRoots 的字段,默认情况下该字段被注释掉。您可以取消注释该字段并添加您定义新类型的文件夹/文件。不要忘记添加“node_modules/@types”,因为这是已安装的“@type”包所在的默认目录。 (2认同)