我正在使用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/