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

Posted

技术标签:

【中文标题】`Session & Partial<SessionData>` 类型上不存在属性 `user`【英文标题】:Property `user` does not exist on type `Session & Partial<SessionData>` 【发布时间】:2021-03-14 09:49:36 【问题描述】:

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

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

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

检查堆栈跟踪,因为我不明白为什么它会在 typeof 上引发错误。也许您正在其他地方访问它,而在那里它为空。 【参考方案1】:

如express-session types comment 中所述,您必须使用Declaration merging

以下是在express-session 上实现Declaration merging 的方法:

import session from 'express-session';

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

【讨论】:

太棒了。谢谢【参考方案2】:

我刚刚遇到了和你一样的问题。这似乎是一个相当新的问题:see explanation here。

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

declare module "express-session" 
  interface Session 
    user: string;
  

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

【讨论】:

我应该怎么做?我的意思是我应该将这段代码写在一个新文件中并将其导入我的主文件吗? 我对ts不是很熟悉;我所做的只是将它放在我执行app.use(session(....)) 的同一个文件中,并且它起作用了。这可能不是最好的方法,但它解决了我的问题。 tsconfig.json 有一个名为 typeRoots 的字段,默认注释掉。您可以取消注释该字段并添加定义新类型的文件夹/文件。不要忘记添加node_modules/@types,因为这是安装@type 包的默认目录。 为什么我没有看到任何 typeRoots?我应该手动添加吗?【参考方案3】:

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

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

【讨论】:

请提供一些解释。 创建一个ts文件,复制上面的代码。然后将其导入任何您需要的地方,并将请求类型设置为它。【参考方案4】:

这是供将来参考,对于完成上述所有步骤但仍然失败的人(vscode不再显示错误但仍然失败),可能是ts-node问题,将--transpile-only添加到您的@987654326 @脚本,像这样:nodemon --exec ts-node -T src/app.ts.

来源:Typescript Declaration Merging fail about Express Request

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于`Session & Partial<SessionData>` 类型上不存在属性 `user`的主要内容,如果未能解决你的问题,请参考以下文章

类型“IntrinsicAttributes & IntrinsicClassAttributes<FormInstance<, Partial<ConfigProps<

没有未定义的 TypeScript Partial<T> 类型

Dojo 学习笔记 之 Dojo hitch&partial

[Javascript] Deep partial equal Object LooksLike

Flask上下文管理session原理和全局g对象

[ DLPytorch ] 循环神经网络进阶&拟合问题&梯度消失与爆炸