typescript 向会话对象添加其他属性

iyr7buue  于 2023-03-09  发布在  TypeScript
关注(0)|答案(2)|浏览(127)

我正在尝试向会话对象添加其他属性

req.session.confirmationCode = confirmationCode;

但收到确认代码属性不存在的错误

Property 'confirmationCode' does not exist on type 'Session & Partial<SessionData>'.

我在要添加此属性的types目录下有index.d.ts文件

declare global {
  namespace session {
    interface SessionData {
      confirmationCode: number;
    }
  }
}

export {};

这是我的tsconfig.json文件

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "lib": ["dom", "es6", "es2017", "esnext.asynciterable"],
    "sourceMap": true,
    "outDir": "./dist",
    "moduleResolution": "node",
    "removeComments": true,
    "strict": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "resolveJsonModule": true,
    "noImplicitAny": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noStrictGenericChecks": true
  },
  "exclude": ["node_modules"],
  "include": ["src"]
}

我在@types/express-session包的源代码中看到,我可以像这样扩展session对象

declare module "express-session" {
  interface SessionData {
    confirmationCode: number;
  }
}

但是当我这样做时,我得到一个错误消息,会话函数不可调用

Type 'typeof import("express-session")' has no call signatures

如何正确扩展会话对象?
UPD 1:这就是我调用会话函数的方法

app.use(
  session({
    name: "wishlify",
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
      maxAge: 1000 * 60 * 60 * 24 * 60, // 2 months
      secure: process.env.NODE_ENV === "production",
    },
  })
);
ttp71kqs

ttp71kqs1#

我在这个question中找到了答案。
我将export {};添加到index.d.ts文件中,现在可以按预期工作了。
这一行使file不是脚本而是模块。
index.d.ts文件的最终版本

declare module "express-session" {
  interface SessionData {
    confirmationCode: number;
  }
}

export {};
pdtvr36n

pdtvr36n2#

node_modules > @types > express-session > index.d.ts中,我发现Session的定义如下所示(我删除了所有注解)。

class Session {
  private constructor(request: Express.Request, data: SessionData);
  id: string;
  cookie: Cookie;
  regenerate(callback: (err: any) => void): this;
  destroy(callback: (err: any) => void): this;
  reload(callback: (err: any) => void): this;
    @see Cookie
  resetMaxAge(): this;
  save(callback?: (err: any) => void): this;
  touch(): this;
}

我刚刚在会话中添加了所需的属性userId
现在我的node_modules > @types > express-session > index.d.ts看起来像:

class Session {
  private constructor(request: Express.Request, data: SessionData);
  id: string;
  userId: number; // This is the property I added.
  cookie: Cookie;
  regenerate(callback: (err: any) => void): this;
  destroy(callback: (err: any) => void): this;
  reload(callback: (err: any) => void): this;
    @see Cookie
  resetMaxAge(): this;
  save(callback?: (err: any) => void): this;
  touch(): this;
}

我不知道这是不是最好的办法,但对我很有效。

相关问题