typescript - 如何使用声明合并来声明附加属性?不覆盖模块?

标签 typescript merge express-session

我正在使用express-session,通过定义类型进行输入(@types/express-session)

我注意到这些类型在 session 字段中没有任何自定义数据。这没那么有用。我希望将其扩展为包含(例如)userId: number

文件@types/express-session显示可以使用以下方式完成:

/**
 * 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;
 *     }
 * }
 *
 */

所以我创建了一个名为 ./src/types/types.ts 的文件,并将以下内容放入其中:

 declare module 'express-session' {
     interface SessionData {
         userId: number;
     }
 }

这“有效”,在该 typescript 中现在可以看到正确的字段。另一方面,express-session 暴露的其他所有内容都不再可见,因为 typescript 不再考虑其他模块定义部分。像 import {Session} from "express-session"; 这样的事情现在给出错误:

TS2305: Module '"express-session"' has no exported member 'Session'.

那么如何扩展模块定义呢?

最佳答案

我面临着类似的事情,实际上是你的问题让我走上了正确的道路。

最后,我创建了自己的文件 express-session.merge.ts,内容如下:

declare module 'express-session' {
    interface SessionData {
        someVal: string;
    }
}
export default 'express-session';

然后我将其包含在 app.ts 的顶部,但在快速 session 导入之后:

import expressSession from 'express-session';
import expressSessionMerge from './express-session.merge';

这将允许您在 session 中使用自定义属性:

req.session.someVal = 'something';

关于typescript - 如何使用声明合并来声明附加属性?不覆盖模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64846227/

相关文章:

fonts - 合并ttf文件

angularjs - 自定义 req.session 属性值的更新似乎持续得不够快

node.js - 如何在本地主机中运行多个express/Nodejs应用程序?

angular - Angular 7.0.1 中的网络 worker 设置

javascript - Angular2 Http 请求

javascript - 将 JSON 对象与 JSON 子对象合并

android - 如何在 node.js 中使用 express 为 Android 应用程序实现服务器端 session ?

javascript - 是否可以通过装饰器知道类中定义了哪些方法和属性

javascript - 在JS中对json数组使用find方法时仅发送键值

sql - 合并数据库如何处理重复的 PK